如何複製一行並使用 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列印前面的行並進行替換。

相關內容