将文本附加到文件中的特定行 bash

appending text to specific line in file bash

所以我有一个文件,其中包含一些由“,”分隔的文本行。我想创建一个脚本来计算一行有多少部分,如果该行包含 16 个部分我想添加一个新部分。到目前为止它工作得很好。唯一不起作用的是在末尾附加“,”。请参阅下面的示例:

原文件:

a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a

预期结果:

a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx

这是我的代码:

            while read p; do
                if [[ $p == "HEA"* ]]
                then
                    IFS=',' read -ra ADDR <<< "$p"
                    echo ${#ADDR[@]}
                    arrayCount=${#ADDR[@]}
                    if [ "${arrayCount}" -eq 16 ];
                    then
                        sed -i "/$p/ s/$/,xx/g" $f 
                    fi
                fi
            done <$f

结果:

a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx

我做错了什么?我确定它有点小,但我找不到它..

可以用awk来完成:

awk -F, 'NF==16{[=10=] = [=10=] FS "xx"} 1' file
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
  • -F, 将输入字段分隔符设置为逗号
  • NF==16 是表示在 {} 中执行块的条件,如果字段数为 16
  • [=15=] = [=15=] FS "xx" 在行尾附加 xx
  • 1 是默认的 awk 操作,表示打印输出

对于使用 sed 的答案应该如下:

  1. 使用${line_number} s/..../..../格式-针对特定行,您需要先找出行号。
  2. 使用特殊字符&表示匹配的字符串

sed 语句应如下所示:

sed -i "${line_number}s/.*/&xx/"

我宁愿把它留给你去玩,但如果你愿意,我可以给你一个完整的工作示例。