7

我想在输出中提取不包含#和 delete";行。

我的输入文件如下所示:

# ;string"1"
# string"2"; 
string"3";

可以使用grepandtr来获得想要的输出:

grep -v '#' FILE | tr -d ';"'  
string3

但是我想使用awk.

我可以提取 invert match ,awk '!/#/' FILE但是如何在同一命令 中使用subto delete ?";awk

4

4 回答 4

5

您可以gsub用于全局替换:

awk '!/#/{gsub(/[";]/,"",$0);print}'

grep/tr以下记录显示了这一点,它提供了与您的管道相同的结果:

pax> echo '# ;string"1"
# string"2"; 
string"3";' | awk '!/#/{gsub(/[";]/,"",$0);print}{}'

string3

请注意,final{}在某些实现中可能不是必需的,awk但它可以在那些实现(通常是较旧的)中停止输出不匹配的行,这些实现会自动为不匹配任何规则的行执行此操作。

于 2013-09-22T07:14:39.273 回答
3

改用gsub它将替换所有匹配项,而不仅仅是一个:

awk  '/#/{next}{gsub(/[";]/,"")}1' file

输出:

string3
  • 跳过第三个参数gsub使其$0默认处理。
  • /#/{next}使其跳过包含的行#
  • 1让它打印$0
于 2013-09-22T07:13:41.157 回答
2

另一个awk版本

awk -F"[\";]" '{$1=$1} !/^#/' OFS= file
string3

awk  '{gsub(/[";]/,x)} !/^#/' file
string3

x代表什么。也可以使用"",但会节省一个字符 :)

于 2013-09-22T08:12:00.383 回答
2

如果你想给sed一个机会:

sed -n '/^[^#]/s/[";]//gp' file
string3
于 2013-09-22T08:54:55.443 回答