macos – 为什么这些简单的shell命令在sed的替换部分中使用时会失败

前端之家收集整理的这篇文章主要介绍了macos – 为什么这些简单的shell命令在sed的替换部分中使用时会失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在试图找到 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/'

猜你在找的Bash相关文章