bash - 找到一个模式,然后仅在该模式之后执行换行

标签 bash shell awk sed

我有一个类似的文件:

H 1 2 3 4
H 1 2 3 4
C 1 2 3 4
 $END

 $EFRAG
COORD=CART
FRAGNAME=H2ODFT
O 1 2 3 4
H 1 2 3 4
H 1 2 3 4
FRAGNAME=H2ODFT
O 1 2 3 4
H 1 2 3 4
H 1 2 3 4

我想仅从 $EFRAG 行之后的行中删除“1”列。并为 O H H 添加标签。我的预期输出是:

H 1 2 3 4
H 1 2 3 4
C 1 2 3 4
 $END

 $EFRAG
COORD=CART
FRAGNAME=H2ODFT
Oa  2 3 4
Hb  2 3 4
Hc  2 3 4
FRAGNAME=H2ODFT
Oa  2 3 4
Hb  2 3 4
Hc  2 3 4

我是 bash 编码新手,不太确定从哪里开始。

我正在考虑将 grep 命令通过管道传输到 sed 命令,但我不确定该语法会是什么样子。我也在尝试学习 awk,但该语法对我来说更令人困惑。目前正在尝试阅读一本有关其功能的书。

任何想法或想法将不胜感激!

L

最佳答案

使用以下awk处理:

awk '$0~/\$EFRAG/ {
    start = 1;  # marker denoting the needed block
    split("a b c", suf);  # auxiliary array of suffixes
}
start {
    if (/^FRAGNAME/) idx = 1;  # encountering subblock
    if (/^[OH]/) {  # if starting with O or H char
        $2 = "";
        $1 = $1 suf[idx++];
    }
}1' test.txt

H 1 2 3 4
H 1 2 3 4
C 1 2 3 4
 $END

 $EFRAG
COORD=CART
FRAGNAME=H2ODFT
Oa  2 3 4
Hb  2 3 4
Hc  2 3 4
FRAGNAME=H2ODFT
Oa  2 3 4
Hb  2 3 4
Hc  2 3 4

关于bash - 找到一个模式,然后仅在该模式之后执行换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75340776/

相关文章:

xml - 如何在 Linux 中使用 sed 更改 XML 文件中的值?

bash - 将当前目录中的文件名列表作为单个字符串发送到 Docker 容器的 STDIN

python - 如何将值附加到 bash shell 脚本中的空数组?

linux - shell : 向命令传递了多少个参数

shell - 使用条件分隔和计算列表中的元素数量

linux - 从 bash 执行 csh-script 并且不关闭 csh-shell,但保持 csh-prompt

regex - 在 bash 中使用 SED 打印 RegEx 匹配项

macos - Mac OS X "El Capitan": cannot read user set Bash environment variables

awk 未将输出打印到辅助文件,语法错误?

regex - awk:输出文件在文件名中包含 ^M 字符