【发布时间】:2015-01-29 14:06:51
【问题描述】:
例如,我有一个包含 ff 组字符串的文件
AAA1111BBB -> FILE1
AAA2222BBB -> FILE2
AAA3333BBB -> FILE3
现在在 unix 中,我想通过搜索 AAA 作为行的开头和 BBB 作为模式的结尾的模式来提取所有 ID。输出会是这样的
1111
2222
3333
然后我想删除所有重复的条目,然后将其保存在一个文件中。我将如何做到这一点?
【问题讨论】:
例如,我有一个包含 ff 组字符串的文件
AAA1111BBB -> FILE1
AAA2222BBB -> FILE2
AAA3333BBB -> FILE3
现在在 unix 中,我想通过搜索 AAA 作为行的开头和 BBB 作为模式的结尾的模式来提取所有 ID。输出会是这样的
1111
2222
3333
然后我想删除所有重复的条目,然后将其保存在一个文件中。我将如何做到这一点?
【问题讨论】:
如果你有grep -P 选项可用,你可以试试
(?<=A{3})\d+(?=B{3})
此正则表达式使用环视查找被AAA 和BBB 包围的数字
【讨论】:
\d+改成.+?
grep -o -P pattern 仅发出匹配项
.*? 代替\d+
嗯,你的小例子可以用这个命令来完成:
sed -e 's/^AAA//' -e 's/BBB.*//' input.txt | sort -u > output.txt
但是,我的猜测是,您的玩具示例可能不足以准确地解释您要完成的工作......
【讨论】:
使用 GNU awk:
gawk '
match($1, /^AAA(.*)BBB$/, m) {keys[m[1]]=1}
END {for (k in keys) print k}
' file
或perl
perl -nE '/^AAA(\w+)BBB/ and $k{$1}=1 }END{ say join "\n", keys %k' file
【讨论】:
我假设您的 ID 是 4 位数字:
grep -oE "AAA[0-9]{4}BBB" <filename> | grep -oE "[0-9]{4}"
编辑:
如果你有类似“AAA12@3BBB”的东西:
grep -oE "AAA.{4}BBB" <filename> | grep -oE "[0-9,@]{4}"
【讨论】: