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