我试图复制文本文件中包含某些特殊字符的行,但在副本中,用“常规”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'
sed
的s
命令可以重用地址模式:
sed '/é/{p;s//e/g;}'
如果你的替换都是单字符替换,那么该y
命令会更有效:
sed '/é/{p;y/é/e/;}'
答案2
$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic
以上使用:
1
使 awk 执行打印当前行的默认操作的惯用 true 条件,然后:gsub()
用 s 替换任何é
se
,如果找到/替换了任何é
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
打印前面的行并进行替换。