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

时间:2015-01-07 11:11:41

标签: bash sed

所以我有一个文件,其中包含由','分隔的一些文本行。我想创建一个脚本来计算一行的多少部分,如果该行包含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

我做错了什么?我确定它的东西很小但我找不到它..

2 个答案:

答案 0 :(得分:3)

可以使用awk完成:

awk -F, 'NF==16{$0 = $0 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
  • $0 = $0 FS "xx"在行尾添加xx
  • 1是默认的awk操作,表示打印输出

答案 1 :(得分:1)

使用sed的答案应该如下:

  1. 使用${line_number} s/..../..../格式 - 定位特定行,您需要先找到行号。
  2. 使用特殊字符&表示匹配的字符串
  3. sed语句应如下所示:

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

    我宁愿留给你玩它,但如果你愿意,我可以给你一个完整的工作样品。