我想在输出中提取不包含#
的行并删除"
,;
。
我的输入FILE如下所示:
# ;string"1"
# string"2";
string"3";
可以使用grep
和tr
来获取所需的输出:
grep -v '#' FILE | tr -d ';"'
string3
但我想使用awk
。
我可以提取反转匹配awk '!/#/' FILE
,但如何在同一sub
命令中使用"
删除;
,awk
?
答案 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