gpt4 book ai didi

bash - 根据条件删除上一行的最后一个字符

转载 作者:行者123 更新时间:2023-11-29 09:39:43 24 4
gpt4 key购买 nike

使用 bash,从下面的 F90 代码片段中,如果下一行以“AA”开头(请注意 AA 之前的空格),我会尝试删除最后一个“&”。

     F = 2 * 3 * a * b * 7&
& * 3 * b * c&
AA = ...

应该变成

     F = 2 * 3 * a * b * 7&
& * 3 * b * c
AA = ...

关于 Bash - Remove the last character of the line this before? 有建议.基于此,我尝试了

perl -0pe 's/\&\n\s*AA/\nAA/g' $MYFILE

还有

sed -i 's/\&\n\s*AA/\nAA/g' $MYFILE

这不会产生任何错误,但也不会改变任何东西。我也试过没有 \s*

最佳答案

使用 sed

使用 GNU sed:

$ sed -z 's/&\n AA/\n AA/g' file
F = 2 * 3 * a * b * 7&
& * 3 * b * c
AA = ...

为了使这个命令简单,我们使用-z 选项一次读入整个文件。 (从技术上讲,-z 读取以 NUL 分隔的输入。由于没有有效的 Fortran 文件包含 NUL,因此这具有读取整个文件的效果。)

s/&\n AA/\n AA/g 进行我们想要的替换。文件包含 & 后跟换行符后跟空格后跟 AA 的任何地方,此替换都会删除 &

如果文件太大而无法放入内存,则一次读取整个文件并不是一个好方法。对于 Fortran 文件,这应该不是问题。

对于非 GNU sed(BSD、OSX),我们需要添加代码来替换 -z 标志:

sed 'H;1h;$!d;x;  s/&\n AA/\n AA/g' file

使用 awk

$ awk '{if (/^ AA/) sub(/[&]$/, "", last); if (NR>1) print last; last=$0} END{print last}' file
F = 2 * 3 * a * b * 7&
& * 3 * b * c
AA = ...

工作原理:

此脚本使用一个变量last,其中包含上一行的内容。如果当前行以 AA 开头,那么我们从 last 中删除(如果存在)最后的 &。更详细:

  • if (/^ AA/) sub(/&$/, "", last)

    如果当前行以 AA 开头,则从上一行中删除最后的 &

  • if (NR>1) 最后打印

    如果我们不在第一行,则打印上一行。

  • last=$0

    将当前行保存为last

  • END{print last}

    到达文件末尾后,打印last

就地更改文件

使用 GNU sed:

sed -zi.bak 's/&\n AA/\n AA/g' file

与其他sed:

sed -i.bak 'H;1h;$!d;x;  s/&\n AA/\n AA/g' file

使用最近的 GNU awk:

awk -i inplace '{if (/^ AA/) sub(/&$/, "", last); if (NR>1) print last; last=$0} END{print last}' file

使用较旧的 awk 或非 GNU awk:

awk '{if (/^ AA/) sub(/&$/, "", last); if (NR>1) print last; last=$0} END{print last}' file >file.tmp && mv file.tmp file

关于bash - 根据条件删除上一行的最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38358462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com