shell 找到一个模式,然后仅在该模式之后执行行更改

ipakzgxi  于 2023-02-05  发布在  Shell
关注(0)|答案(2)|浏览(123)

我有一个类似的文件:

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型

qoefvg9y

qoefvg9y1#

使用以下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
06odsfpq

06odsfpq2#

ed是否可用/可接受。
script.ed(随你自己的心意命名)类似于:

/\$EFRAG$/;$g/^O /s/^\([^ ]*\) [^ ]* \(.*\)$/\1a  \2/\
/^H /s/^\([^ ]*\) [^ ]* \(.*\)$/\1b  \2/\
/^H /s/^\([^ ]*\) [^ ]* \(.*\)$/\1c  \2/
,p
Q

现在快跑

ed -s file.txt < script.ed
  • 如果需要 * 就地 * 编辑,请将Q更改为w
  • 卸下,p以使输出静音。

相关问题