使用awk删除不规则表达式

时间:2013-11-13 10:44:50

标签: regex awk

我遇到了问题,我无法逃避它。 我正在使用以下行解析文件:

word1 word2 #(one, two, three) word3(x y z) word4(a b c)
etc

我需要删除所有子字符串#(one, two, three),识别此子字符串的唯一约束是它以"#(" and end with ")"开头 字段编号或子字符串的内容不是常规的

你能给我一些建议吗? 提前谢谢!

5 个答案:

答案 0 :(得分:2)

首先,我喜欢你的问题中的“术语”:不规则表达。 ;)

试试这一行:

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)

答案 1 :(得分:2)

你可以说:

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)

答案 2 :(得分:2)

由于这是一行上的简单替换,因此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”或将sub()更改为awk中的gsub()。

答案 3 :(得分:1)

从你的标签中,我看到你怀疑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中的运算符分组。

答案 4 :(得分:0)

当你谈到删除我认为你可能想要改变输入文件本身。您可以在nedit中进行查找和替换。 要查找的字符串:^#(。*)$ \ n 替换为:

(即没有替换)