Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 获取xargs到word拆分占位符{}_Bash_Xargs - Fatal编程技术网

Bash 获取xargs到word拆分占位符{}

Bash 获取xargs到word拆分占位符{},bash,xargs,Bash,Xargs,(虽然在Bash中有一个特定的定义,但在本文中它的意思是在空格或制表符上拆分。) 使用此输入向xargs演示问题 $ cat input.txt LineOneWithOneArg LineTwo WithTwoArgs LineThree WithThree Args LineFour With Double Spaces 这个Bash命令用于响应传递给它的参数 $ bash -c 'IFS=,; echo "$*"' arg0 arg1 arg2 arg3 arg1,arg2,arg

(虽然在Bash中有一个特定的定义,但在本文中它的意思是在空格或制表符上拆分。)

使用此输入向xargs演示问题

$ cat input.txt
LineOneWithOneArg
LineTwo WithTwoArgs
LineThree WithThree Args
LineFour  With  Double  Spaces
这个Bash命令用于响应传递给它的参数

$ bash -c 'IFS=,; echo "$*"' arg0 arg1 arg2 arg3
arg1,arg2,arg3
注意
xargs-L1
word是如何将每一行分割成多个参数的

$ xargs <input.txt -L1 bash -c 'IFS=,; echo "$*"' arg0
LineOneWithOneArg
LineTwo,WithTwoArgs
LineThree,WithThree,Args
LineFour,With,Double,Spaces
虽然这在绝大多数情况下都是完全合理的行为,但有时会首选分词行为(第一个
xargs
示例)

虽然可以将
xargs-L1
视为一种变通方法,但它只能用于将参数放在命令行的末尾,因此无法表达

$ xargs -I{} command first-arg {} last-arg
使用
xargs-L1
。(当然,除非
命令
能够以不同的顺序接受参数,就像选项一样。)

在展开
{}
占位符时,有没有办法让
xargs-I{}
对每一行进行单词分割?
排序

echo -e "1\n2 3" | xargs sh -c 'echo a "$@" b' "$0"
产出:

a 1 2 3 b
a 1 b
a 2 3 b
参考:

此外:

产出:

a 1 2 3 b
a 1 b
a 2 3 b

啊,有趣。。。这可以通过将要由
xargs
执行的所需命令包装到shell中来解决问题,以便
xargs
to将参数传递给shell。然后,shell脚本通过
$@
变量引用单词分割参数。聪明!谢谢但是等等,你不是想要两个结果吗
a1b
a23b
?这实际上是一个完美的解决方案,将shell包装器与
$@
一起使用。你是说别的吗?我不确定你是想让我的例子的输出在一行上是
a23b
,还是在两行上是
a1b
a23b
,所以我编辑了我的答案,把这两个选项都包括进去。啊,谢谢你的澄清。在我最初的示例中,我使用了
-L1
-I{}
,这两种方法在每次命令调用时都使用一行输入。当然,有其他选择也无妨。