特定の特殊文字を含むテキストファイルの行をコピーしようとしますが、コピー内の特殊文字は「一般」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を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
前の行を印刷して置き換えます。