如何复制一行并使用 sed 搜索和替换重复行?

如何复制一行并使用 sed 搜索和替换重复行?

我试图复制文本文件中包含某些特殊字符的行,但在副本中,用“常规”ASCII 字符替换特殊字符。具体用例是重音字符。

输入:

éva
test
frédéric

期望的输出:

éva
eva
test
frédéric
frederic

现在我可以复制包含该é字符的行,但我不确定如何在捕获组中搜索和替换。

这是我到目前为止所得到的:

echo 'éva\ntest\nfrédéric' | sed 's/\(.*é.*\)/&\n\1/'

我可以这样做吗sed?如果没有的话,我很乐意与awk...合作

答案1

您可以匹配é然后应用多个命令:

sed '/é/{p;s/é/e/g;}'

对于任何包含 的行é,这将打印当前模式空间,然后将所有és 替换为e(并再次打印模式空间)。

AWK 等效项是

awk '/é/{print; gsub(/é/, "e")}1'

seds命令可以重用地址模式:

sed '/é/{p;s//e/g;}'

如果你的替换都是单字符替换,那么该y命令会更有效:

sed '/é/{p;y/é/e/;}'

答案2

$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic

以上使用:

  1. 1使 awk 执行打印当前行的默认操作的惯用 true 条件,然后:
  2. gsub()用 s 替换任何és e,如果找到/替换了任何és,那么在条件上下文中使用的正返回会再次导致 awk 执行打印当前(现在已修改)行的默认操作。

请注意,通过使用返回码 fromgsub()来告诉我们是否é找到了任何 s,它使我们不必/é/在命令中重复指定相同的正则表达式。

答案3

另一种sed选择 - 灵感来自@EdMorton 的awk回答

sed -n 'p;s/é/e/gp' file

答案4

另外一个选择,类似于@Stephen Kitt的

$ sed '/é/p;s/é/e/g'
éva
eva
test
frédéric
frederic

  • /é/p选择有字符的行é并打印。
  • s/é/e/g打印前面的行并进行替换。

相关内容