Linux 如何在bash中正确打印读取行
在尝试迭代纯文本文件时,我有一种奇怪的行为:Linux 如何在bash中正确打印读取行,linux,bash,sed,Linux,Bash,Sed,在尝试迭代纯文本文件时,我有一种奇怪的行为: #!/bin/bash sed -n "5,5p" test.tmp while read linea in do echo $linea done < test.tmp 我附上这两个文件是为了帮助澄清这里发生的事情: 脚本: 输入数据: 提前感谢我会做什么: #!/bin/bash while IFS= read -r linea; do printf '%s\n' "$linea" done < <(
#!/bin/bash
sed -n "5,5p" test.tmp
while read linea in
do
echo $linea
done < test.tmp
我附上这两个文件是为了帮助澄清这里发生的事情:
- 脚本:
- 输入数据:
#!/bin/bash
while IFS= read -r linea; do
printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)
#/bin/bash
而IFS=读取线性A;做
printf'%s\n'$linea'
完成后,我终于找到了发生的事情。while语句中有一个额外的“in”。也许我混合了两种不同的口味
我曾经:
当你在读linea的时候
做
回声线
完成
应改为:
读线性####在删除和删除中;新增
做
回声线
完成
再次感谢如果在空白处拆分行。重新定义它,以便只使用换行符分隔输入echo$linea
,首先,与echo“$linea”
相比,它添加了大量的错误,或者更好的是--printf“%s\n'$linea”
。除此之外,请参阅BashFAQ 1,了解正确读取输入的全面讨论:还有,您的sed
命令读取文件并将输出写入stdin——但是您的while
循环迭代原始文件,而不是sed
的输出。首先,非常感谢您的回答。很明显,我必须深入学习脚本,但我只需要几年编写一次脚本,我什么都忘了。我只是想澄清一下我的帖子。sed命令只是命令的一个示例,它按照我的预期工作,以显示特定的行,我不希望它作为循环的输入。我明天会检查这是否有效。。。脚本语法在使用多年后对我来说仍然是个谜…需要清除IFS
,并使用-r
参数来读取
,才能完全准确。实际上,这会去除尾随的空格(或其他IFS
字符),并将反斜杠转义序列处理为它们的关联字符。此外,printf“%s\n'$linea”
的角位大小写将少于echo
;考虑行为只包含<代码> -n>代码>。您可能应该提到<代码> ->代码>,即使在这种情况下不需要。<代码> ECHO——“$LIAEA”<代码>,与POSIX兼容,将打印文字字符<代码> -/COD>;与printf中的相同
;这就是为什么我建议不要在这两种情况下使用它。
#!/bin/bash
while IFS= read -r linea; do
printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)