使用sed或awk替换参数值

时间:2017-12-31 14:14:26

标签: linux awk sed

我有一些配置文件,例如

sed

我想更改未注释行中的A_place值。一些线可能有初始空格。我尝试了一个基本的AWK命令来查找和替换它,但它没有用。也许我应该使用mm而不是流编辑器?

5 个答案:

答案 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完成通用解决方案:

  1. =周围的空格可以随时删除
  2. 我们将在左侧搜索完全匹配
  3. 键值包含单个未加引号的词
  4. 有了这个,我们可以用键和值作为参数创建一个小的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