【问题标题】:Remove trailing newlines using GNU sed使用 GNU sed 删除尾随换行符
【发布时间】:2016-03-19 04:28:25
【问题描述】:

我正在尝试使用 sed 单行来使用 handy sed one-liners 之一删除尾随换行符:

sed --in-place -e :a -e '/^\n*$/{$d;N;ba}'

它适用于 UNIX 样式的换行符,但不适用于 DOS 样式的换行符。 尽管我无法完全理解sed 脚本语法和匹配规则,但我尝试了以下方法:

sed --binary --in-place -e :a -e '/^\(\r\?\n\)*$/{$d;N;ba}'

但它没有帮助,我真的不知道为什么。

我真的不想使用 Perl 等,我想坚持使用更多“核心”实用程序。 那么,周围有没有sed 大师?我将衷心感谢您的帮助。 我正在使用 Cygwin 的 sed 分布。

谢谢。

具体来说,我想要这个文件(使用cat -A 打印出来):

1^M$
^M$
^M$

变成这样:

1$

【问题讨论】:

  • dos2unix 文件,然后运行你的 sed 东西。
  • @pvg 我想在我的.bashrc 中创建一个别名,所以如果它是一个单独的命令,我真的很想,因为管道dos2unixsed 比运行sed 更棘手一个人。
  • 应该不是问题。或者只是让它成为一个 bash 函数,更易于阅读和维护。 stackoverflow.com/questions/756756/…
  • @pvg 是的,但是每个文件都需要单独的seddos2unix 等)调用...我知道我可以创建一个函数,但我只是想知道如果我能做得更简单。
  • 如果您只想删除文件末尾的换行符而不是文件中间的换行符,那么这不是一个好的输入/输出示例。

标签: bash sed cygwin


【解决方案1】:

您尝试使用错误的工具来完成这项工作。 sed 用于对单独的行进行简单的替换,仅此而已。对于任何看起来更有趣的事情,您应该使用 awk,例如使用 GNU awk 的一种方法是:

$ cat -v file
1^M
^M
^M
$ awk -v RS='^$' -v ORS= '{sub(/(\r?\n)+$/,"\n")}1' file | cat -v
1

与其他 awks:

$ awk '{rec = rec $0 RS} END{sub(/(\r?\n)+$/,"\n",rec); printf "%s",rec}' file | cat -v
1

无论行尾是 DOS 还是 UNIX,上述方法都适用。

【讨论】:

  • 嘿,你的答案对我有用!我的命令弄乱了输出换行符..至少在 Linux 上..
【解决方案2】:

你能像这样使用tr吗?

tr -d '\r\n' < file1 > tempfile && mv tempfile file1

这会翻译 file1 并删除 \r\n

【讨论】:

  • 我可以,但我真的很想用一个程序(比如sed)来做这件事,因为我想在我的.bashrc 中使用alias。创建一个函数需要多次 sed 调用一堆文件等,因此非常感谢单个程序调用。
【解决方案3】:

是的,这有效:

sed --binary --in-place -e :a -e '/^\(\r\n\)*\r$/{$d;N;ba}'

真的很想删除问题,但为时已晚。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2011-11-13
    • 2019-06-04
    • 2010-09-21
    • 1970-01-01
    • 2011-05-25
    • 2016-08-20
    相关资源
    最近更新 更多