优化xargs参数枚举

时间:2017-01-22 13:57:10

标签: linux bash xargs

可以更好地优化xargs参数enumaration的使用吗? 目的是在实际命令的中间注入单个参数。

我做:

echo {1..3} | xargs -I{} sh -c 'for i in {};do echo line $i here;done'

echo {1..3} | for i in $(xargs -n1);do echo line $i here; done

我明白了:

line 1 here
line 2 here
line 3 here

这是我需要的,但我想知道是否可以避免循环和临时变量?

4 个答案:

答案 0 :(得分:1)

您需要将输入分隔为xargs换行符:

echo {1..3}$'\n' | xargs -I% echo line % here

对于数组扩展,您可以使用printf

ar=({1..3})
printf '%s\n' "${ar[@]}" | xargs -I% echo line % here

(如果仅用于输出,则可以在没有xargs的情况下使用它:

printf 'line %s here\n' "${ar[@]}"

答案 1 :(得分:0)

也许这个?

echo {1..3} | tr " " "\n" | xargs -n1 sh -c ' echo "line $0 here"'

tr用换行符替换空格,因此xargs看到三行。如果有更好(更有效)的解决方案,我不会感到惊讶,但这个很简单。

请注意我已修改我之前的答案,以删除{}的使用,评论中建议使用<input class="nice" type="date" name="birth_date" value="<?php echo is_object($values["birth_date"]) ? $values["birth_date"]->format("Y-m-d") : $values["birth_date"]?>"> 以消除潜在的代码注入漏洞。

答案 2 :(得分:0)

GNU sed还有一个众所周知的功能。您可以将e标志添加到s命令,然后sed执行模式空间中的任何内容,并将该模式​​空间替换为输出(如果该命令)。

如果你真的只对echo命令的输出感兴趣,你可以尝试这个GNU sed示例,它消除了临时变量,循环(以及xargs):

echo {1..3} | sed -r 's/([^ ])+/echo "line \1 here"\n/ge
  • 它获取一个标记(即由空格分隔的任何标记)
  • 将其替换为echo "line \1 here"\n命令,并将\1替换为令牌
  • 然后执行echo
  • 将echo命令的输出放回模式空间
  • 表示它输出三个回声的结果

但获得所需输出的更好方法是跳过执行并直接在sed中进行转换,如下所示:

echo {1..3} | sed -r 's/([^ ])+ ?/line \1 here\n/g' 

答案 3 :(得分:0)

尝试不使用xargs。对于大多数情况xargs来说是过度的。 根据您的真实需要,您可以选择

等解决方案
# Normally you want to avoid for and use while, but here you want the things splitted.
for i in $(echo {1 2 3} );do 
   echo line $i here;
done

# When you want 1 line turned into three, `tr` can help
echo {1..3} | tr " " "\n" | sed 's/.*/line & here/'

# printf will repeat itself when there are parameters left
printf "line %s here\n" $(echo {1..3})

# Using the printf feature you can avoid the echo
printf "line %s here\n"  {1..3}