Fre*_*Tep 8 sed text-processing
我试图复制文本文件中包含某些特殊字符的行,但在副本中,用“常规”ASCII 字符替换特殊字符。具体用例是重音字符。
\n输入:
\n\xc3\xa9va\ntest\nfr\xc3\xa9d\xc3\xa9ric\n
Run Code Online (Sandbox Code Playgroud)\n期望的输出:
\n\xc3\xa9va\neva\ntest\nfr\xc3\xa9d\xc3\xa9ric\nfrederic\n
Run Code Online (Sandbox Code Playgroud)\n现在我可以复制包含该字符的行\xc3\xa9
,但我不确定如何在捕获组中搜索和替换。
这是我到目前为止所得到的:
\necho '\xc3\xa9va\\ntest\\nfr\xc3\xa9d\xc3\xa9ric' | sed 's/\\(.*\xc3\xa9.*\\)/&\\n\\1/'\n
Run Code Online (Sandbox Code Playgroud)\n我可以这样做吗sed
?awk
如果没有的话,我很乐意与...合作
Ste*_*itt 14
您可以匹配\xc3\xa9
然后应用多个命令:
sed '/\xc3\xa9/{p;s/\xc3\xa9/e/g;}'\n
Run Code Online (Sandbox Code Playgroud)\n对于任何包含 的行\xc3\xa9
,这将打印当前模式空间,然后将所有\xc3\xa9
s 替换为e
(并再次打印模式空间)。
AWK 等效项是
\nawk '/\xc3\xa9/{print; gsub(/\xc3\xa9/, "e")}1'\n
Run Code Online (Sandbox Code Playgroud)\nsed
\xe2\x80\x99ss
命令可以重用地址模式:
sed '/\xc3\xa9/{p;s//e/g;}'\n
Run Code Online (Sandbox Code Playgroud)\n如果你的替换都是单字符替换,那么该y
命令会更有效:
sed '/\xc3\xa9/{p;y/\xc3\xa9/e/;}'\n
Run Code Online (Sandbox Code Playgroud)\n
Ed *_*ton 11
$ awk '1; gsub(/\xc3\xa9/,"e")' file\n\xc3\xa9va\neva\ntest\nfr\xc3\xa9d\xc3\xa9ric\nfrederic\n
Run Code Online (Sandbox Code Playgroud)\n以上使用:
\n1
使 awk 执行打印当前行的默认操作的惯用 true 条件,然后:gsub()
\xc3\xa9
用s替换任何e
s,如果找到/替换了任何\xc3\xa9
s,那么在条件上下文中使用的正返回会再次导致 awk 执行打印当前(现在已修改)行的默认操作。请注意,通过使用返回码 fromgsub()
来告诉我们是否找到了任何s,它使我们不必在命令中\xc3\xa9
重复指定相同的正则表达式。/\xc3\xa9/
另一种sed
选择 - 受到@EdMorton\'sawk
答案的启发
sed -n \'p;s/\xc3\xa9/e/gp\' file\n
Run Code Online (Sandbox Code Playgroud)\n
另一种选择,类似于@Stephen Kitt\'s:
\n$ sed \'/\xc3\xa9/p;s/\xc3\xa9/e/g\'\n\xc3\xa9va\neva\ntest\nfr\xc3\xa9d\xc3\xa9ric\nfrederic\n
Run Code Online (Sandbox Code Playgroud)\n/\xc3\xa9/p
选择有字符的行\xc3\xa9
并打印。s/\xc3\xa9/e/g
打印前面的行并进行替换。