在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
首先,为什么:

  • 行的打印顺序与原始文件不同
  • 未对picture1_123.txt执行任何操作,且未打印picture1
  • 谢谢大家!

    怎么了 以下是您的旧代码所做的:

    • 在循环的第一次(也是唯一一次)迭代中,
      readline
      将第一行读入
      line
    • cut
      命令读取文件的其余部分,并将仅提取所需字段的结果写入stdout。它没有检查、读取或修改
      变量
    • 最后,您的
      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