可以更好地优化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
这是我需要的,但我想知道是否可以避免循环和临时变量?
答案 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
替换为令牌但获得所需输出的更好方法是跳过执行并直接在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}