【问题标题】:bash command to remove new lines if condition on the next line is met如果满足下一行的条件,则 bash 命令删除新行
【发布时间】:2020-03-03 22:27:53
【问题描述】:

我有以下文件

cat file.txt

Alex
Josh
c.ab23
Shawn
c.a13
c.oq42
Allie
c.ba212

仅当下一行以c. 开头时,我想用制表符替换新行,如下所示:

Alex
Josh    c.ab23
Shawn   c.a13   c.oq42
Allie   c.ba212

我认为类似于

perl -pe 's/\nc\./\t/g'

虽然我猜 perl 是逐行读取的。是否有另一个简单的命令可以做到这一点?

【问题讨论】:

  • 下一个命令应该这样做perl -0777 -pe 's/\n(c\.)/\t$1/g' file.txt

标签: regex perl newline


【解决方案1】:

您的 perl 命令可以使用 -0777 switch 一次对整个文本进行操作:

perl -0777 -pe 's/\n(?=c\.)/\t/g' file.txt

(并且就地,如果您添加 -i switch

【讨论】:

  • 您已删除c.,它仍然存在于所需的输出中。可能你的意思是perl -0777 -pe 's/\n(c\.)/\t$1/g' file.txt
  • 只是想知道 -0777 的作用是什么?据我所知,file.txt 必须是一组 ASCII 字节,所以我不确定为什么大多数 bash 命令对新行的处理方式不同
  • @user171558 链接文档解释了该选项 - -p 默认逐行操作,-0 允许您以各种方式更改此分隔符。
  • 至于为什么-p和很多unix实用程序都是逐行操作的——对于大量的文本处理任务来说,这是最方便的默认设置。
  • 请访问以下webpage并查找0777选项(将整个文件读入变量,在这种情况下变量为$_)。
【解决方案2】:
awk '/^c\./ {P=P"\t"$0; next} {if (P) print P; P=$0} END {if (P) print P}' < file.txt

输出

Alex
Josh    c.ab23
Shawn   c.a13   c.oq42
Allie   c.ba212

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 2021-06-06
    • 1970-01-01
    • 2020-09-11
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多