Awk:对字符串使用反转匹配然后替换字符

时间:2013-09-22 07:10:42

标签: awk

我想在输出中提取不包含#的行并删除";

我的输入FILE如下所示:

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

可以使用greptr来获取所需的输出:

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

但我想使用awk

我可以提取反转匹配awk '!/#/' FILE,但如何在同一sub命令中使用"删除;awk

4 个答案:

答案 0 :(得分:5)

您可以使用gsub进行全局替换:

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

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

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

string3

请注意,在{}的某些实现中可能不需要最后的awk,但它可以在那些实现(通常是旧的)实现自动执行的实现中停止输出非匹配行不符合任何规则。

答案 1 :(得分:3)

使用gsub代替所有匹配而不仅仅是一个:

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

输出:

string3
  • 将第三个参数跳至gsub会使其默认处理$0
  • /#/{next}会跳过包含#
  • 的行
  • 1使其打印$0

答案 2 :(得分:2)

另一个awk版本

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

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

x代表什么都没有。也可以使用"",但保存一个字符:)

答案 3 :(得分:2)

如果您想给sed一个机会:

sed -n '/^[^#]/s/[";]//gp' file
string3