代码之家  ›  专栏  ›  技术社区  ›  William Pursell

正在分析行继续

  •  1
  • William Pursell  · 技术社区  · 15 年前

    解析行继续符的最简单方法是什么?这看起来像是一个基本的动作,我很惊讶没有基本的命令来做这件事。“while read”和“while read-r”循环不做我想做的,我找到的最简单的解决方案是下面的SED解决方案。有没有一种方法可以用像tr这样的基本方法来实现这一点?

    $ cat input
    Output should be \
    one line with a '\' character.
    $ while read l; do echo $l; done < input
    Output should be one line with a '' character.
    $ while read -r l; do echo $l; done < input
    Output should be \
    one line with a '\' character.
    $ sed '/\\$/{N; s/\\\n//;}' input
    Output should be one line with a '\' character.
    $ perl -0777 -pe 's/\\\n//s' input
    Output should be one line with a '\' character.
    
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   pilcrow    15 年前

    如果通过 “最简单” 您的意思是简洁易读,我建议您对Perl ISM做一个小修改:

    $ perl -pe 's/\\\n//' /tmp/line-cont
    

    不需要占用大量的内存 ... -0777 ... (整个文件slurp模式)开关。

    然而,如果 “最简单” 你的意思不是离开贝壳,这就足够了:

    $ { while read -r LINE; do
        printf "%s" "${LINE%\\}";    # strip line-continuation, if any
        test "${LINE##*\\}" && echo; # emit newline for non-continued lines
        done; } < /tmp/input
    

    (我更喜欢) printf "%s" $USER_INPUT echo $USER_INPUT 因为 回声 不能告诉便携设备停止寻找开关,以及 普林特 通常是内置的。)

    只需把它塞进用户定义的函数中,就不会再被它所厌恶了。注意:后一种方法将向缺少新行的文件添加一个尾随新行。

        2
  •  0
  •   Robert Fraser    15 年前

    Regex的方式看起来很不错。

        3
  •  0
  •   Imagist    15 年前

    我之所以选择Perl解决方案,仅仅是因为如果您以后想添加更多的功能,它可能是最可扩展的。