【问题标题】:How to preserve newline characters in grep result?如何在 grep 结果中保留换行符?
【发布时间】:2011-03-22 03:42:24
【问题描述】:

我想将 grep 结果分配给一个变量以供进一步使用:

lines=$(cat abc.txt | grep "hello")

但我发现 wa $lines 不包含换行符。所以当我这样做时

echo $lines

只打印一行。如何保留换行符,所以当我回显 $lines 时,它会生成与 cat abc.txt | grep "hello" 相同的结果。

【问题讨论】:

标签: bash


【解决方案1】:

你想说

echo "$lines"

而不是

echo $lines

详细说明:

echo $lines 表示“通过将$lines 替换为名为@9​​87654325@ 的变量的内容来形成一个新命令,将其拆分为空格以形成echo 命令的零个或多个新参数。例如:

lines='1 2 3'
echo $lines   # equivalent to "echo 1 2 3"
lines='1   2   3'
echo $lines   # also equivalent to "echo 1 2 3"
lines="1
2
3"
echo $lines   # also equivalent to "echo 1 2 3"

所有这些示例都是等效的,因为 shell 忽略了存储在变量 lines 中的各个单词之间的特定类型的空格。实际上,更准确地说,shell 将变量的内容拆分为特殊 IFS(内部字段分隔符)变量的字符,该变量默认(至少在我的 bash 版本中)为三个字符空格、制表符、和换行符。

另一方面,echo "$lines" 表示从变量 lines 的确切值形成一个新参数。

有关更多详细信息,请参阅 bash 手册页的“扩展”和“分词”部分。

【讨论】:

    【解决方案2】:

    为 grep 使用 Windows 端口(不是最初的问题,我知道并且不适用于 *nix)。我发现-U很好地解决了这个问题。

    来自--help

    -U, --binary 在 EOL (MSDOS) 时不去除 CR 字符

    【讨论】:

    • 它有效。谢谢@Haggisbreath。使用 -U 日志打印新行。 grep 命令是... electron app.js | grep --line-buffered -i -e "错误" -U | tee logs.txt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2013-11-10
    • 2015-08-16
    相关资源
    最近更新 更多