我在分割线条时遇到问题。我有意见。
echo dat1 dat2 dat3 | tr " " "n" | xargs -I {} -p ln -s {}
我需要从行中获取命令。输出必须为:
echo
tr
xargs
我不能使用命令 awk。
$ 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
)。
基于格雷普的答案:
$ echo 'echo dat1 dat2 dat3 | tr " " "n" | xargs -I {} -p ln -s {}' | grep -oP '(^|| *)K[^ ]*'
echo
tr
xargs
请注意,echo ... | command
最好写成command <<< ...
。有关更多详细信息,请参阅 JID 的评论。
免责声明:最好的选择是使用 awk
,但既然你说你不能这样做,这里有另外两个解决方案:
选项 1:用于循环和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:]].*$//'