Linux xargs在格式中不保留前导空格
在LinuxCShell中,我需要用一个变量替换文件中的一行,该变量包含一组数字和一个字符串。我正在使用printf、xargs和sed的组合来保留所建议的格式。 这是我到目前为止的代码(我在csh中找不到更简单的方法): 结果是:Linux xargs在格式中不保留前导空格,linux,sed,printf,csh,xargs,Linux,Sed,Printf,Csh,Xargs,在LinuxCShell中,我需要用一个变量替换文件中的一行,该变量包含一组数字和一个字符串。我正在使用printf、xargs和sed的组合来保留所建议的格式。 这是我到目前为止的代码(我在csh中找不到更简单的方法): 结果是: > 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
> 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
问题在于使用-I
时,xargs
会从每个输入行中修剪前导空格,您可以通过以下方式进行验证:
% 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/OSXxargs
不支持-d
选项,因此需要以下变通方法来按原样传递行(也适用于GNUxargs
):
你太棒了,谢谢。我更改了问题的标题,以便其他人可以更轻松地找到他们的相关问题。@S.M:我很高兴-感谢您更新问题的标题。
% echo ' A B ' | xargs -d'\n' -I {} echo "[{}]"
[ A B ]
% echo ' A B ' | tr '\n' '\0' | xargs -0 -I {} echo "[{}]"
[ A B ]