私は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
これはいくつかの複雑な引用です。議論はsed
2つの部分で構成されています。まず、'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')"