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

dee*_*lue 7 command-line sed awk text-processing

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

set stime = '0 0'
Run Code Online (Sandbox Code Playgroud)

我需要将其更改为:

set stime = '0 4'
Run Code Online (Sandbox Code Playgroud)

我试过这些命令:

sed -i 's/original/new/g' file.txt
Run Code Online (Sandbox Code Playgroud)

awk '{gsub(/pattern/,"replacement")}' file 
Run Code Online (Sandbox Code Playgroud)

但它们不起作用。我想这是因为模式中的撇号。我怎样才能正确地做到这一点?

Yar*_*ron 8

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

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

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

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

你有几个选择:

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

    sed -i "s/set stime = '0 0'/set stime = '0 4'/g" file
    
    Run Code Online (Sandbox Code Playgroud)

    或者

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

    replacement="set stime = '0 4'"
    pattern="set stime = '0 0'"
    
    Run Code Online (Sandbox Code Playgroud)

    然后

    sed "s/$pattern/$replacement/g" file
    
    Run Code Online (Sandbox Code Playgroud)

    或者

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

    sed '/set stime/{s/0 0/0 4/}' file 
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    awk '$1=="set" && $2=="time"{sub("0 0","0 4")}1' file
    
    Run Code Online (Sandbox Code Playgroud)