替换文本文件每行中第n次出现的字符串


15

我有大型文本文件,使用空格分隔字符串(2-5)。字符串可以包含“'”或“-”。我想用管道代替第二个空间。

最好的方法是什么?

使用sed我在想:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

还有其他/更好/更简单的想法吗?

Answers:


22

您可以在替代命令的末尾添加一个数字。例如,以下将用的每行上old的字符串替换第二次出现newfile

sed 's/old/new/2' file

因此,您可以使用:

sed 's/ /|/2'

有关更多信息,请参见本sed教程


2
sed信息文件中:“注意:POSIX标准未指定混合g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sed实现时应发生的情况。对于GNU sed,交互定义为:忽略第NUMBER个匹配项,然后匹配并替换所有从第NUMBER开始匹配。”
暂停,直到另行通知。

信息文件...我讨厌他们。无论如何,我删除了模棱两可的部分。好评论,+ 1。
mrucci

1
谢谢,穆鲁奇和丹尼斯。我认为那里一定有一些简单的东西。
dnkb 2010年

似乎我在使用文本处理时遇到的每个问题,都可以通过解决sed。我不确定我是否应该感谢您为sed我提供了更多帮助,但无论如何我还是会的。;)
Jamie

1

您尝试过您的版本了吗?奏效了吗?因为我认为这基本上是一个好主意。不过,我会做些不同:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

这将接受单词中非空格的任何字符,并且在前两个单词之间接受多个空格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.