Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止命令替换的多行输出在BASH脚本中被连接?_Bash_Variables_Do Loops - Fatal编程技术网

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

如何阻止命令替换的多行输出在BASH脚本中被连接?,bash,variables,do-loops,Bash,Variables,Do Loops,我在多个子目录中有文本文件 some/path/one/file some/path/two/file some/path/three/file some/path/foo/file 我需要能够grep文件进行匹配,但保留单独的行返回,以便以后可以使用循环单独处理每个匹配 我有: SITE=$(grep -w $1 some/path/*/file) 然而,这只会产生一个非常长的字符串,所有的东西都在一行中紧密相连 理想情况下,此变量将包含每行路径名中的*值: 例如: some/path/o

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

some/path/one/file

some/path/two/file

some/path/three/file

some/path/foo/file

我需要能够grep文件进行匹配,但保留单独的行返回,以便以后可以使用循环单独处理每个匹配

我有:

SITE=$(grep -w $1 some/path/*/file)
然而,这只会产生一个非常长的字符串,所有的东西都在一行中紧密相连

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

例如:

some/path/one/file

some/path/three/file

包含一行,其中包含

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
while read line; do
    WHATEVER=$(echo "$i" | cut -d ':' -f 1 | cut -d '/' -f 3)
    echo $WHATEVER
done < <(grep -w bar some/path/*/file)
但我得到的却是:

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-e“$SITE”
-e
选项保留所有制表符、空格和换行符。别忘了引用

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

echo -n "$SITE" | while read line ; do
  echo "$line"
done
将输出涂抹到一行的不是
$()
命令替换;它是一个不带引号的变量的
echo
。如果执行echo“$SITE”,您将看到多行输出

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

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
while read line; do
    WHATEVER=$(echo "$i" | cut -d ':' -f 1 | cut -d '/' -f 3)
    echo $WHATEVER
done < <(grep -w bar some/path/*/file)
IFS=$”\r\n“行=($(grep-w$1some/path/*/file))

这将创建一个行数组

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


在此处查看更多信息

您不能将grep的输出打印到文件中,而不是捕获grep的输出吗?这样,您将有一行为每个匹配,其中将包括文件名。哇。。。那是个愚蠢的错误。感谢您在阅读时提出的
想法@user2773624不是一个愚蠢的错误:)这是
bash
中经常让人绊倒的奇怪事情之一。