在试图找到这个 sed 问题的答案时,我想出了一个我无法理解的奇怪行为。
假设我有一个名为data
$> cat data
foo.png
abCd.png
bar.png
baZ.png
任务是使用 sed in line 将所有大写 ASCII 字符的行替换为小写。所以输出应该是:
$> cat data
foo.png
abcd.png
bar.png
baz.png
该解决方案应该适用于非 gnu sed,也适用于 Mac 上的 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 的功能失败并产生与输入相同的文本。
shell专家可以解释一下这种奇怪的行为吗?