在bash while循环中解析和回显字符串
我有一个具有此结构的文件:在bash while循环中解析和回显字符串,bash,while-loop,Bash,While Loop,我有一个具有此结构的文件: picture1_123.txt picture2_456.txt picture3_789.txt picture4_012.txt 我只想得到文件名的第一段,即picture1到picture4。 我首先使用了以下代码: cat picture | while read -r line; do cut -f1 -d "_"; echo $line; done 这将返回以下输出: picture2 picture3 picture4 pict
picture1_123.txt
picture2_456.txt
picture3_789.txt
picture4_012.txt
我只想得到文件名的第一段,即picture1到picture4。
我首先使用了以下代码:
cat picture | while read -r line; do cut -f1 -d "_"; echo $line; done
这将返回以下输出:
picture2
picture3
picture4
picture1_123.txt
当我将代码更改为以下内容时,此错误得到纠正:
cat picture | while read line; do s=$(echo $line | cut -f1 -d "_"); echo $s; done
picture1
picture2
picture3
picture4
首先,为什么:
- 在循环的第一次(也是唯一一次)迭代中,
将第一行读入readline
line
命令读取文件的其余部分,并将仅提取所需字段的结果写入stdout。它没有检查、读取或修改cut
变量行
- 最后,您的
完整地编写了第一行,没有任何内容被剪切echo$line
- 因为所有的输入都被
消耗掉了,所以下一个cut
消耗掉的内容就没有了,所以循环再也不会运行了读取行
如何做对 执行此操作的简单方法是让
read
分离出前缀:
while IFS=_ read -r prefix suffix; do
echo "$prefix"
done <picture
您的
cut
命令正在读取stdin的整个剩余部分,因此下一个read
命令将不会留下任何内容……如果您希望它只剪切行中的内容,并将结果保存回行
,则可能会改为行=$(cut-f1-d)\另外,请注意,echo$line
本身就有缺陷。请始终引用您的扩展,如echo“$line”
中所述;请参阅--或尝试使用名为*\u foo.txt的文件进行测试
cut -f1 -d_ <picture