我試圖複製文字檔案中包含某些特殊字元的行,但在副本中,用“常規”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
列印前面的行並進行替換。