Linux操作系统。如何切线

时间:2015-04-27 06:52:00

标签: bash

我有分裂线的问题。 我有输入。

echo dat1 dat2 dat3 | tr " " "\n" | xargs -I {} -p ln -s {}

我需要从线上获取命令。输出必须是:

echo    
tr     
xargs

我无法使用命令awk。

2 个答案:

答案 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:]].*$//'