在试图找到
this sed question的答案时,我想出了一个我无法理解的奇怪行为.
假设我有一个名为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,但awk的tolower()函数失败并产生相同的文本作为输入.
shell专家可以解释这种奇怪的行为.
sed 'y/ABCDEFGHIJKLMNOPQRSYUVWXYZ/abcdefghijklmnopqrstuvwxyz/'