2016-02-20 14 views
-3

很难制定一个问题,最好我会举例说明。 TXT文件有这些行如果它有多个匹配项,Grep字符串

city:state:address 
city:state 
city: 

我需要提取的字符串,其中

a) only one occurrences of : 
b) only one occurrences of : and has value after : 
c) two occurrences of : 

,并把这些字符串的差异和文件,所以一个文件将包含与秒所有字符串与city:state第三个city:

注意:文件有很多这样的字符串。不一定要在一个命令中创建三个文件。这将是足够的一个命令,我可以定义多少个:字符串应该包含。

回答

3

使用grep和管道的这些调用输出到不同的文件:

  1. grep -E "^[^:]+:\s*$" file.txt
  2. grep -E "^[^:]+:[^:]+$" file.txt
  3. grep -E "^[^:]+:[^:]+:.*$" file.txt

它寻找的东西是不是:与正则表达式[^:]+ 。它在开始和结束时使用^$来匹配整个输入行。

3

这是awk的工作,而不是grep。所有你需要的是:

awk -F':' ' 
    NF==3 { print > "file_c"; next } 
    { print > ($2=="" ? "file_a" : "file_b") } 
' file 

这将创建所有文件,你想在你的输入文件的一次通过。

如果您有更多的字段和更多的规则,请将它们全写下来,以便它们互斥,例如,你可以实现上述为:

NF==3   { print > "file_c" } 
    NF==2 && $2=="" { print > "file_a" } 
    NF==2 && $2!="" { print > "file_b" } 
相关问题