如何仅替换文件中模式的第 N 次出现?

Sur*_*mar 12 sed perl text-processing

如何使用sed命令替换文件中第三次出现的字符串。

例子:

仅更改文件中第三次出现的isto us

我的输入文件包含:

hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Run Code Online (Sandbox Code Playgroud)

预期的输出是:

hai this is linux.
hai thus is unix.
hai this us mac.
hai this is unchanged.
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 12

使用perl.

要更改第 3出现:

perl -pe 's{is}{++$n == 3 ? "us" : $&}ge'
Run Code Online (Sandbox Code Playgroud)

每 3更改一次:

perl -pe 's{is}{++$n % 3 ? $& : "us"}ge'
Run Code Online (Sandbox Code Playgroud)


jim*_*mij 5

sed如果以前的换行符被替换为任何其他字符,您可以使用它,例如:

tr '\n' '\000' | sed 's/is/us/3' | tr '\000' '\n'
Run Code Online (Sandbox Code Playgroud)

与纯 (GNU) 相同sed

sed ':a;N;$!ba;s/\n/\x0/g;s/is/us/3;s/\x0/\n/g'
Run Code Online (Sandbox Code Playgroud)

sed换行符无耻地从/sf/answers/87653401/窃取)

  • 如果您要使用 GNU `sed` 特定语法,您也可以使用 `sed -z 's/is/us/3'`。 (2认同)