xargs 不保留格式中的前导空格

xargs does not preserve leading whitespace in format

在 Linux C Shell 中,我需要用一个包含一组数字和一个字符串的变量替换文件中的一行。我结合使用 printf、xargs 和 sed 来保留 this answer 建议的格式。 这是我到目前为止的代码(我在 csh 中找不到更简单的方法):

> echo "  2  2  2  2  2  2  2  2     Number of gradient directions" > myfile.txt
> set ndir = `repeat 8 printf '  2'`
> set ndir[1] = 16
> set afmt1 = `repeat 8 printf '%%3d'`
> set afmt = "$afmt1%s"
> printf "$afmt" $ndir "     Number of gradient directions" | xargs -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt

结果是:

> cat myfile.txt
16  2  2  2  2  2  2  2     Number of gradient directions

但我需要:

> cat myfile.txt
 16  2  2  2  2  2  2  2     Number of gradient directions

唯一的问题是该行仅针对变量 $ndir 的第一个索引丢失了 %3d 格式。我需要为整行保留这种格式。有没有更巧妙的方法或解决方法?

-d'\n' 添加到您的 xargs 命令中:

printf "$afmt" $ndir "     Number of gradient directions" | xargs -d'\n' -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt

问题是 xargs 在使用 -I 时从每个输入行删除前导空格,您可以按如下方式验证:

% echo '  A   B  ' | xargs -I {} echo "[{}]"
[A  B  ]

添加选项 -d'\n' 停用此行为并导致整行按原样传递:

% echo '  A   B  ' | xargs -d'\n' -I {} echo "[{}]"
[  A  B  ]

顺便说一句(与 Linux 无关):

BSD/OSX xargs 不仅用 -I 修剪 both 前导和尾随空格,它还规范化行内部空格;由于 BSD/OSX xargs 不支持 -d 选项,因此需要以下解决方法来按原样传递行(也适用于 GNU xargs):

% echo '  A   B  ' | tr '\n' '[=13=]' | xargs -0 -I {} echo "[{}]"
[  A  B  ]