この正規表現は何を意味しますか?

この正規表現は何を意味しますか?

私はUnix改行をWindows改行に変換する作業をしています。私はunix2dosを試しましたが、いくつかのバイナリエラーが発生し、それを見つけて偶然この正規表現を見つけました。

sed 's/$'"/`echo \\r`/" input.txt > output.txt

この正規表現はうまくいきますが、どのように機能するのかわかりません。明らかに私はこの形式でそれを説明しようとしています。

sed 's/a/b/'

ここ

aは$ '"を参照しています。理解できません。b
echo \\\r'\ r'を参照しています。

また、一重引用符と二重引用符の組み合わせを使用する理由/方法は理解できません。誰でも私にこの正規表現を説明できますか?

答え1

いいえ$'"

's/$'"/`エコ \\r`/" == "s/\$/`エコ \\r`/"

$ただし、正規表現の作成者は一重引用符でエスケープすることを好みます。

必要に応じてこれらのエスケープを組み合わせることができます。

したがって、正規表現は行の\r末尾に追加されます。

直す。最初はecho\\rだけでなく、"echo\\r"も使用したことは明確ではありませんでした。ここでは使用する必要はありませんecho。 sedから直接実行できます。

sed 's/$/\r/'

答え2

これはいくつかの複雑な引用です。議論はsed2つの部分で構成されています。まず、's/$'文字を生成する単一引用符で囲まれた文字列リテラルがありますs/$。その後には、コマンド置換を含む二重引用符文字列が続きます`echo \\\r`。これにより、シェルに基づいてCR文字をecho \r印刷するコマンドが実行されます。\r(印刷されたテキストはecho改行文字で終わりますが、コマンドの置き換えによって内容が消費されます。)このコマンドが望ましい効果を得るには、echo \rここでマークされているCR文字を印刷するシステムを使用する必要があります

sedの主張は次のとおりですs/$/␍/。これにより、正規表現のすべての項目が$文字列に置き換えられます。正規表現は$空の文字列と一致しますが、行末でのみ一致するため、このsedコマンドは各行にCRを追加します。 Unix 行は LF で終わり、Windows 行は CR+LF で終わるため、Unix 行末は Windows 行末に変換されます。

GNU sed(他のバージョンではない)はバックスラッシュエスケープを理解しています\r。したがって、GNU sedを使用して作成できますsed 's/$/\r/'。ただし、これは他のsed実装(BSD、Solarisなど)では機能しません。echo \r携帯性も良くありません。移植可能なソリューションは、trバックスラッシュが標準にエスケープされているものを使用することです。

sed "$(echo 's/$/@/' | tr '@' '\r')"

関連情報