我有一些配置文件,例如
sed
我想更改未注释行中的A_place值。一些线可能有初始空格。我尝试了一个基本的AWK
命令来查找和替换它,但它没有用。也许我应该使用mm
而不是流编辑器?
答案 0 :(得分:3)
使用sed:
sed -e '/#/!s/\(A_place[[:space:]]*=[[:space:]]*\)\(.*\)/\1"new_value"/' input
在这里完成的工作细分:
跳过评论行:
<强> /#/!强>
然后是
形式的替换S /旧/新/
选择旧的,并将原始字符串放入parens(反向引用)中,以便稍后通过指定\ 1来保留它。这匹配字符串&#34; A_place&#34;然后是零个或多个空格字符,后跟等号后跟零个更多的空格字符。请注意,要替换的值也在parens中,可以由\ 2引用;这里不需要它,而且可以不用它们。所以匹配的旧字符串是:
( A_place [[:space:]] * = [[:space:]] * )(。*)
然后使用&#34; \ 1&#34;创建要输出的新行。 backref,保留等号周围的空白并附加&#34;新值&#34;,为了清楚起见,此处显示的是引号,它们是新行中的文字,但在最终输出中可能不需要。 &#34; \ 1&#34;这里是第一个paren分隔的正则表达式中匹配的所有内容,包括等号周围的任何空格:
\ 1&#34; NEW_VALUE&#34;
答案 1 :(得分:1)
关注awk
可能对您有帮助。
awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file
或者如果OP想要更改A_place
字符串的最后一列值,请使用:
awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file
如果您有多个字符串A_place
,则将sub
更改为gsub
。此外,如果您想将输出保存到相同的Input_file中,那么您也可以使用以下代码。
awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file > temp_file && mv temp_file Input_file
<强> OR 强>
awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file > temp_file && mv temp_file Input_file
答案 2 :(得分:0)
以下sed表达式将A_place
的新距离设置为32km。保留新距离的所有空间:
> cat kk.config
A_place = 10km
B_place=5km
#A_place=2km
C_place=1km
> sed -i -e 's/^\( *A_place *= *\).*/\132km/' kk.config
> cat kk.config
A_place = 32km
B_place=5km
#A_place=2km
C_place=1km
正则表达式的一个问题是有很多种口味。显然,sed使用基本的正则表达式,如果你想为以后的后引用分组东西,你必须反斜杠括号。插入符号将从行的开头开始匹配,因此忽略注释中的匹配。
答案 3 :(得分:0)
当我们假设一些事情时,可以使用awk
完成通用解决方案:
=
周围的空格可以随时删除有了这个,我们可以用键和值作为参数创建一个小的shell包装器run.sh
:
key=$1
value=$2
awk -F '[ =]*' \
-v key=$key \
-v value=$value \
'/^#/ { print; next }
$1 == key { $2 = value }
{ print $1 "=" $2 }' sample.txt
示例运行:
$ sh run.sh A_place 20km
A_place=20km
B_place=5km
#A_place=2km
C_place=1km
答案 4 :(得分:0)
简单sed
解决方案:
val="2km"
sed "/^[[:blank:]]*A_place[[:blank:]]*=/s/=.*/= ${val}/" file