我遇到了问题,我无法逃避它。 我正在使用以下行解析文件:
word1 word2 #(one, two, three) word3(x y z) word4(a b c)
etc
我需要删除所有子字符串#(one, two, three)
,识别此子字符串的唯一约束是它以"#(" and end with ")"
开头
字段编号或子字符串的内容不是常规的
答案 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 替换为:
(即没有替换)