行をコピーし、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'

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. 1awkに現在の行を印刷する基本操作を実行させるための慣用的なtrue条件は次のとおりです。
  2. gsub()ésをsに置き換えe、sが見つかる/置き換えられると、条件付きéコンテキストで再び肯定的な戻り値を使用すると、awkは現在(現在変更されている)行を印刷する基本的な操作を実行します。

の戻りコードを使用してsが見つかったかgsub()どうかを知らせると、コマンドで同じ正規表現を繰り返し指定する必要éはありません。/é/

答え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前の行を印刷して置き換えます。

関連情報