我面临一个问题,我无法逃避它。我正在解析一个文件,其中包含以下行:
word1 word2 #(one, two, three) word3(x y z) word4(a b c)
etc
我需要删除所有子字符串#(one, two, three)
,识别这个子字符串的唯一约束是它以"#(" and end with ")"
字段编号或子字符串的内容不规则开头
你能给我一些建议吗?提前致谢!
你可以说:
awk '{gsub("#([^)]*))", "", $0);}1' inputfile
对于您的输入:
$ awk '{gsub("#([^)]*))", "", $0);}1' <<< 'word1 word2 #(one, two, three) word3(x y z) word4(a b c)'
word1 word2 word3(x y z) word4(a b c)
首先,我喜欢“术语”:您问题中的不规则表达。;)
试试这一行:
awk -F'#\\([^)]*\\)' '{$1=$1}7' file
测试:
kent$ echo "word1 word2 #(one, two, three) word3(x y z) word4(a b c)"|awk -F'#\\([^)]*\\)' '{$1=$1}7'
word1 word2 word3(x y z) word4(a b c)
由于这是对单行的简单替换,因此 sed 非常适合这项工作:
$ sed 's/#([^)]*)//' file
word1 word2 word3(x y z) word4(a b c)
但如果您需要 awk 解决方案:
$ awk '{sub(/#([^)]*))/,"")}1' file
word1 word2 word3(x y z) word4(a b c)
如果模式可以在每一行出现多次,则在 sed 命令的末尾添加“g”或将 awk 中的 sub() 更改为 gsub()。
从您的标签中,我看到您怀疑 awk 可以做到,但 Perl 也可以做得很好:
perl -pe 's/#\([^)]*\)//g'
或者,对于您的完整示例:
echo "word1 word2 #(one, two, three) word3(x y z) word4(a b c)" | perl -pe 's/#\([^)]*\)//g'
或者,您的数据在文件中的位置:
perl -pe 's/#\([^)]*\)//g' your_file
为了澄清,我使用的 RE 说“替换一个哈希,然后是一个左括号,然后是任意数量的不是右括号的字符,最后是一个没有任何内容的右括号,全局”。括号被转义了,因为它们是 Perl 中的分组运算符。
当您谈论删除时,我认为您可能想要更改输入文件本身。您可以在 nedit 中进行查找和替换。要查找的字符串:^#(.*)$\n 替换为:
(即无所取代)