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

时间:2016-08-02 05:16:34

标签: linux sed printf csh xargs

在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格式。我需要为整行保留这种格式。是否有更微妙的方式或修复这种方式?

1 个答案:

答案 0 :(得分:1)

-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修剪两个前导空格和尾随空格,它还标准化行内部空白;由于BSD / OSX xargs不支持-d选项,因此需要以下解决方法按原样传递行(也适用于GNU xargs):

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