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)
但它们不起作用。我想这是因为模式中的撇号。我怎样才能正确地做到这一点?
为了转义单引号',您应该使用双引号:"。
为了就地更新,您应该使用 sed -i
以下代码应就地更新,并转义单引号:
sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
Run Code Online (Sandbox Code Playgroud)
你有几个选择:
对 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)将模式保存在 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)不要使用整个模式。只需找到正确的行并仅替换需要更改的内容,避免引用。例如,如果您只有一次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)