この sed の質問の答えを見つけようとしているときに、理解できない奇妙な動作を思いつきました。
というファイルがあるとしましょうdata
$> cat data
foo.png
abCd.png
bar.png
baZ.png
タスクは、行内で sed を使用して、すべての行を大文字の ASCII 文字から小文字に置き換えることです。したがって、出力は次のようになります。
$> cat data
foo.png
abcd.png
bar.png
baz.png
このソリューションは、Mac の sed のように非 gnu sed でも動作するはずです
この埋め込み awk を sed の交換部品にしようとしました:
sed -E 's/[^ ]*[A-Z][^ ]*.png/'$(echo \&|awk '{printf("<%s>[%s]",$0, tolower($0))}')'/' data
奇妙なことに、これはこれを出力します:
foo.png
<abCd.png>[abCd.png]
bar.png
<baZ.png>[baZ.png]
ご覧のとおり、sed は大文字のアルファベットを含む正しい行を選択しています。これは awk にも到達していtolower()
ますが、awk の機能は失敗し、入力と同じテキストを生成しています。
シェルの専門家は、この奇妙な動作を説明できますか?