0

我面临一个问题,我无法逃避它。我正在解析一个文件,其中包含以下行:

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

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

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

4

5 回答 5

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)
于 2013-11-13T10:52:48.780 回答
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)
于 2013-11-13T10:50:26.397 回答
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”或将 awk 中的 sub() 更改为 gsub()。

于 2013-11-13T18:04:50.833 回答
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 中的分组运算符。

于 2013-11-13T11:32:43.380 回答
0

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

(即无所取代)

于 2013-11-13T15:13:22.433 回答