文字处理命令:如果' x'但不是' y'然后添加' z'在行尾

时间:2016-04-02 06:55:59

标签: bash awk sed

我们说我有以下输入:

CH12
CH23au
RCH34
CH99de
ZE33a
CH88aude
CHa

我希望输出为:

CH12au
CH23au
RCH34
CH99deau
ZE33a
CH88aude
CHaau

根据规则,该行必须以' CH'而且没有模式' au'

我将如何做到这一点?

我想我必须使用sed?或者awk?

4 个答案:

答案 0 :(得分:3)

这是一个简单的Awk脚本,它在没有au的行的开头查找CH。最终1是“打印所有输入行”的常用习惯用法,$0是当前输入行。

awk '/^CH/ && ! /au/ { $0 = $0 "au" }1' file

如果你想在外部变量中使用后缀,则需要进行轻微的重构。

awk -v suf="au" '/^CH/ && $0 !~ suf { $0 = $0 suf } 1' file

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed '/^CH/{/au/!s/$/au/}' file

专注于从CH开始的行,如果他们不包含au,请附加行。

答案 2 :(得分:1)

使用sed:

sed '/au/!s/^CH\(.*\)/CH\1au/' file
  • /au/!:不包含au
  • 的行
  • s:替换
  • ^CHCH
  • 开头
  • \(.*\)后跟任何字符(使用\( \)
  • 捕获
  • CH\1au将匹配模式替换为CH,后跟捕获的字符,然后结束au

答案 3 :(得分:0)

你可以试试这个:

awk '
{
    if(substr($0, 0, 2) == "CH")
    {
        if(index($0, "au") == 0)
            printf("%sau\n",$0)
        else
            print $0
    }
    else
        print $0
}' file