繁体   English   中英

如何在BASH脚本中连接命令替换的多行输出?

[英]How do I stop multiple line output from command substitution from being concatenated in BASH script?

我在多个子目录中有文本文件

一些/路径/一个/文件

一些/路径/二/文件

一些/路径/三相/文件

一些/路径/富/文件

...

我需要能够grep文件以获得匹配,但保留单独的行返回,以便我可以稍后使用循环单独操作每个匹配。

我有:

SITE=$(grep -w $1 some/path/*/file)

然而,这只会产生一个非常长的字符串,所有内容都只是在一行中一起消失。

理想情况下,此变量将包含每行上路径名的*值:

例如:

一些/路径/一个/文件

一些/路径/三相/文件

包含一个包含bar的行。

SITE=$(grep -w bar some/path/*/file)
echo $SITE

应该是这样的:

some/path/one/file:this is a line of text that has bar in it
some/path/three/file:this is a line of text that has bar in it

但相反,我明白了:

some/path/one/file:this is a line of text that has bar in it some/path/three/file:this is a line of text that has bar in it

有没有办法使这个变量多行,以便以后我可以做的事情:

for i in `echo $SITE`; do
WHATEVER=$(echo $i | cut -d ':' -f 1 | cut -d '/' -f 3)
echo $WHATEVER
done

并输出为:

one
three

或者我完全以错误的方式解决这个问题?

$()命令替换不是将输出压缩到一行; 它是一个不带引号的变量的echo 如果您echo "$SITE" ,您将看到多行输出。

话虽如此,逐行读取的常用方法是while read构造。 你可以这样做:

while read line; do
    WHATEVER=$(echo "$i" | cut -d ':' -f 1 | cut -d '/' -f 3)
    echo $WHATEVER
done < <(grep -w bar some/path/*/file)

注意我们可以在最后一行使用管道而不是<()进程替换,但如果在while循环中设置的变量需要保留在while循环之外的范围内,则上述情况会更好。

当然,如果您只需要输出,那么以下内容就更简单了:

grep -w bar some/path/*/file | cut -d ':' -f 1 | cut -d '/' -f 3

如果仅用于显示,则总是echo -e "$SITE" -e选项保留所有选项卡,空格和换行符。 不要忘记引号。

如果要稍后在脚本中处理每一行,可以尝试以下操作:

echo -n "$SITE" | while read line ; do
  echo "$line"
done

IFS=$'\\r\\n' LINES=($(grep -w $1 some/path/*/file))

这将创建一系列行

然后,您可以遍历数组并单独处理每一行${LINES[i]}

在此处查看更多信息https://stackoverflow.com/a/11393884/652904

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM