我有分裂线的问题。 我有输入。
echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}
我需要从线上获取命令。输出必须是:
echo
tr
xargs
我无法使用命令awk。
答案 0 :(得分:2)
$ echo 'echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}'
echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}
$ echo 'echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}' | awk '{print $1}' RS='|'
echo
tr
xargs
说明:awk
,记录分隔符= |
,在每条记录中打印第一个字段($1
)。
基于grep的回答:
$ echo 'echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}' | grep -oP '(^|\| *)\K[^ ]*'
echo
tr
xargs
注意,echo ... | command
最好写成command <<< ...
。有关更多详细信息,请参阅JID的评论。
答案 1 :(得分:1)
免责声明:最佳选择是使用awk
,但由于您声明不能这样做,所以还有其他两个解决方案:
选项1:For循环和cut
#!/usr/bin/env bash
data='echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}'
IFS="|"
for l in ${data}; do
echo $l | xargs | cut -d ' ' -f 1
done
<强>解释强>
将内部字段分隔符设置为|
字符,以便for l in
沿这些行分隔。
然后每一行都通过xargs
,仅删除前导空格,最后放入cut
,沿空格切割并返回它看到的第一个项目。
选项2:sed
首先将|
以及之后找到的空格转换为换行符,然后从每个(新)行的第一个空格中删除所有内容:
echo ${data} | sed -e 's/|[[:space:]]*/\n/g' | sed -e 's/[[:space:]].*$//'