使用 sed 命令查找模式的第一次出现并追加

使用 sed 命令查找模式的第一次出现并追加

假设有一个文本文件如下:

Hello world
types=""
Mario
types="Game"

我想做的就是找到第一个出现的单词type=""并附加该单词program

我想要的输出:

Hello world
types="program"
Mario
types="Game"

我需要在 Unix shell 脚本中使用。

我尝试过的:

sed -i  '1,/types=\"\"/s/types=\"\"/types=\"program\"/' filename

该命令仅插入而不追加。尝试添加a\但仍然不起作用。

答案1

{   sed '/types=""/!b
        s/"/&program/;q'
    cat
}   <infile >outfile

POSIXsed会将其输入文件偏移量准确地保留在其q输入位置。不过,对于 GNU,sed您可能需要这个-u选项。

答案2

您可以使用i插入,然后d删除该行,然后q退出:

~$ sed '/types=""/{i\
> types="program"
> d;q}' f
Hello world
types="program"
Mario
types="Game"

以下不起作用(感谢@mikeserv):或者只是c更改线路并q退出:

~$ sed '/types=""/{c\
> types="program"
> q}' f
Hello world
types="program"
Mario
types="Game"

(当然,保留-ifor 的位置)

答案3

POSIXly:

$ sed -e '1,/types=""/{
  //s/"/&program/
}
' file

奇怪的是上面在 GNU sed 上失败了,你需要:

$ sed -e '1,/types=""/{
  /types=""/s/"/&program/
}
' file

types=""如果出现在第一行,以上所有内容都会失败。在这种情况下,您可以使用 GNU sed 或 BSD sed 0,/pattern/

$ sed -e '0,/types=""/{                
  /types=""/s/"/&program/
}
' file

或 POSIX 之一:

$ sed -e '/types=""/{
  s/"/&program/
  :1
  n
  b1
}
' file

或看@mikeserv 的回答

相关内容