私はこの表現をたくさん使っていますline=${line//[$'\r\n']}
。しかし、これは何を[$'\r\n']
意味しますか?
文字を削除できることはわかっていますが、'\r\n'
どうすればよいですか? 2文字のインスタンスのみを削除しますか、それとも1文字の一致も検索しますか?
この構文の使い方を理解できません。
可能であればマニュアルリンクお願いします。この質問に対する答えが見つかりません。
答え1
このコマンドは、変数からすべてのキャリッジリターンと改行バイトを削除しますline
。
${line//XYZ}
これはパラメータ拡張のためのBash(およびzshとksh)拡張です。みんなパターンは何でもXYZ
一致します$line
。
このパターンには[$'\r\n']
2つのコンポーネントがあります。[...]
マッチどの内部文字。$'\r\n'
はいANSI-Cの引用(他の拡張子)、キャリッジリターン(\r
)、および改行(\n
)バイトに拡張されます。これにはキャリッジリターンと改行文字が[$'\r\n']
含まれているため、[...]
両方とも一致します。
これ完全なマニュアルシェルコマンド、演算子、括弧などがすべてここにあります。、POSIX/SUS/IEEE 1003.1 仕様の一部です。これ吹く参考マニュアルはこちら。
答え2
~からバッシュマニュアル:
${範囲/模様/ひも}
これ模様ファイル名拡張と同様に、パターンを生成するために拡張されます。範囲拡張され、最も長い一致模様 その値は文字列に置き換えられます。コンテストは次の規則に従って行われます(参照:パターンマッチング)。もし 模様、で始まる/
すべての一致模様に置き換えられますひも。 ...もしひも空、一致模様これは削除され、/
次のパターンは省略できます。
あなたは${line//[$'\r\n']}
以下を持っています:
- これ範囲はい
line
、 - これ模様は次のとおりです
/[$'\r\n']
(注:で始まる/
ので、パターン内のすべての項目が置き換えられます)。 - これひも空なので、
/
その後模様省略され、一致が削除されます。
次の規則に従ってくださいパターンマッチング:
[…]
含まれているすべての文字と一致します。
$'...'
\r
bashに特定のエスケープシーケンス(ここではキャリッジリターンと改行)を解釈\n
し、それをエスケープシーケンスが表す実際の文字に置き換えるように指示します。
したがって、この交換はキャリッジリターン(CR、\r
)または改行(LF、\n
)のすべてのインスタンスを一致させて削除します。
答え3
$意味:ビューモードの行末パターンは '\ r \ n'です。意味: \r(キャリッジリターン文字) \n(改行文字)
角かっこ[]は、検索対象を別々の行に囲むために使用されます。