如何找到一个模式,并以不同的方式替换它?

时间:2010-10-27 09:29:41

标签: regex linux

我在删除文件中的重复行时遇到问题,并将其替换为非重复行。理想情况下,我只想用连续序列替换它,以便可以分离重复的行。

我正在考虑使用某种通配符(*):

sed -e "s/text_pattern/text_pattern*/g" my_file.txt

每次返回时,都会在text_pattern中添加一个新数字。但是,我无法在手册页和互联网上找到合适的解决方案。有没有人知道如何做这样的事情?也许sed不是最佳选择?

谢谢!

3 个答案:

答案 0 :(得分:0)

Awk似乎更适合此任务。我将假设您并不真正需要正则表达式,但希望将整行与固定字符串匹配。然后你可以这样做:

awk -v ln="text_pattern" '$0 == ln { $0 = $0 " " ++i };1' my_file.txt

答案 1 :(得分:0)

我不相信sed是这个的工具。如果你需要这些任务的正则表达式,你可以使用perl(它建立在awk sed上)。

cat test | perl -e '$i = 1; while (<>) { chomp($_); if (s/pattern/pattern$i/) { $i++ }; print $_."\n"; }'

也就是说,对于stdin中的每一行:删除换行符,然后将计数器附加到pattern,如果找到它。并且,如果找到它,请将其增加1.然后打印该行。

编辑:测试是您的输入文件。

答案 2 :(得分:0)

<强> uniq的

  • uniq -c input.txt显示发生的频率。
  • uniq -u input.txt打印唯一的行。

<强> AWK

  • awk 'x[$0]++' input.txt打印重复的行。
  • awk '!x[$0]++' input.txt删除重复的行。

<强> SED

  • sed '$!N; /^\(.*\)\n\1$/P; D' input.txt打印重复的行。
  • sed '$!N; /^\(.*\)\n\1$/!P; D' input.txt删除重复的行。