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 ]
在 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 ]