【问题标题】:bash read loop only reading first line of input variablebash读取循环仅读取输入变量的第一行
【发布时间】:2014-01-20 06:25:41
【问题描述】:

我有一个读取循环,它正在读取一个变量,但没有按照我期望的方式运行。我想读取变量的每一行并处理每一行。这是我的循环:

while read -r line
do
   echo $line | sed 's/<\/td>/<\/td>$/g' | cut -d'$' -f2,3,4 >> file.txt
done <<< "$TABLE"

我希望它处理文件的每一行,但它只处理第一行。如果我的中间只是 echo $line >> file.txt 它按预期工作。这里发生了什么?如何获得我想要的行为?

【问题讨论】:

  • 你能显示cat -vte &lt;&lt;&lt; "$TABLE"的输出吗
  • 输出只是$
  • 所以你原来的字符串$TABLE是空的?
  • 我的错误输出是这样的:&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;...&lt;/tr&gt;^M&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;...&lt;/tr&gt;^M&lt;tr&gt;&lt;td&gt;&lt;/td&gt; 等等。全部在一条线上。
  • 不确定我在这里看到了整个while 循环的意义,除非它只是删除空格。为什么不只是sed '/&lt;\/td&gt;/&lt;\/td&gt;$/g' &lt;&lt;&lt; "${TABLE}" | cut -d'$' -f2-4 &gt; file.txt

标签: bash delimiter


【解决方案1】:

您的行似乎由\r 而不是\n 分隔。

使用此 while 循环使用 read -d $'\r' 迭代输入:

while read -rd $'\r' line; do
    echo "$line" | sed 's~</td>~</td>$~g' | cut -d'$' -f2,3,4 >> file.txt
done <<< "$TABLE"

【讨论】:

    【解决方案2】:

    如果$TABLE 包含多行字符串,我推荐

    printf '%s\n' "$TABLE" |
    while read -r line; do
       echo $line | sed 's/<\/td>/<\/td>$/g' | cut -d'$' -f2,3,4 >> file.txt
    done
    

    这也更便于移植,因为这里字符串的 '

    【讨论】:

    • 这将在子shell中运行while运行,这可能并不总是预期的
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2019-12-16
    • 2019-01-11
    相关资源
    最近更新 更多