替换文件内包含撇号的模式

替换文件内包含撇号的模式

我有一个包含以下行的文本文件:

set stime = '0 0'

我需要将其更改为:

set stime = '0 4'

我尝试了以下命令:

sed -i 's/original/new/g' file.txt

awk '{gsub(/pattern/,"replacement")}' file 

但它们不起作用。我猜是因为模式中的撇号。我该如何正确执行此操作?

答案1

为了转义单引号',您应该使用双引号:"

为了进行就地更新,您应该使用sed -i

以下代码应就地更新,并转义单引号:

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name

答案2

您有以下几种选择:

  1. 对于 sed 或 awk 命令,使用双引号而不是单引号:

    sed -i "s/set stime = '0 0'/set stime = '0 4'/g" file
    

    或者

    awk "{gsub(/set stime = '0 0'/,\"set stime = '0 4'\")}1;" file 
    
  2. 将模式保存在 shell 变量中并使用双引号:

    replacement="set stime = '0 4'"
    pattern="set stime = '0 0'"
    

    然后

    sed "s/$pattern/$replacement/g" file
    

    或者

    awk -vpat="$pattern" -vrep="$replacement" '{gsub(pat,rep)}1;' file 
    
  3. 不要使用整个模式。只需找到正确的行并替换需要更改的内容,避免使用引号。例如,如果您只出现一次set stime,您可以执行以下操作:

    sed '/set stime/{s/0 0/0 4/}' file 
    

    或者

    awk '$1=="set" && $2=="time"{sub("0 0","0 4")}1' file
    

相关内容