【问题标题】:bash not replacing a line on matching string due to more match由于更多匹配,bash没有替换匹配字符串上的一行
【发布时间】:2022-01-17 13:39:09
【问题描述】:

这可能看起来很简单,但我无法让它工作。我有一个属性文件,包含如下内容。

AVAIL_COLS=col1,col2,col3,col4,col5
SC_AVAIL_COLS=col1,col2,col3

在我的 bash 脚本中,我对可用的 cols 属性进行了一些处理和修改,并尝试在文件中替换它。如下所示。

propfile=<my property file>
line_avail_cols="AVAIL_COLS="
line_sc_avail_cols="SC_AVAIL_COLS="
available_cols=$(grep $line_avail_cols $propfile | grep -v $line_sc_avail_cols)

# Doing some operations to add few more values to same row.
available_cols="$available_cols,col6,col7,col8"

#Replace the line with new content
sed -i '/'"$line_avail_cols"'/c\'"$available_cols" $propfile

如果我的属性文件只有 AVAIL_COLS 属性而没有 SC_AVAIL_COLS,则上述脚本可以正常工作。 但是如果属性文件包含 SC_AVAIL_COLS 属性,那么它不会替换该行,而是在文件中添加一个新行,从而在文件中创建重复条目。

如何直接替换 AVAIL_COLS 属性行?文件中的行号或属性顺序可能会有所不同。所以我一直在寻找一种通用的方法。

预期输出

AVAIL_COLS=col1,col2,col3,col4,col5,col6,col7,col8
SC_AVAIL_COLS=col1,col2,col3

【问题讨论】:

  • 你的 grep 管道在我看来很奇怪。你感兴趣的整条线是什么样子的?一个grep "^ *$line_avail_cols" "$propfile" 不够吗?或者可能是grep -wF "$line_avail_cols" "$propfile"
  • 或者,您可以将awk 视为解决方案,即awk -F = '"AVAIL_COLS" { print($0 ",col6,col7,col8") }' "$profile" &gt; "new.$propfile" 之类的东西,从而替换grepsed
  • @user1934428 最初我只做$(grep $line_avail_cols $propfile) 并且由于相同的匹配而得到了两条线。谷歌给了我这个命令:D 脚本人不多
  • 这当然行不通。您忘记了 ^-w(取决于您的偏好)。请参阅我在评论中给出的建议。
  • @user1934428 grep 无论如何都对我有用。从这个答案得到stackoverflow.com/a/6064412/2353403

标签: bash awk sed


【解决方案1】:

您需要区分这两行,因为第二行也符合您的条件。

尝试在行首包含^,如下所示:

sed -i '/^'"$line_avail_cols"'/c\'"$available_cols" $propfile

【讨论】:

    【解决方案2】:

    你可以像这样修复你的脚本:

    propfile="$1"
    line_avail_cols="AVAIL_COLS="
    line_sc_avail_cols="SC_AVAIL_COLS="
    available_cols="$(grep "^$line_avail_cols" $propfile)"
    
    # Doing some operations to add few more values to same row.
    available_cols="$available_cols,col6,col7,col8"
    
    #Replace the line with new content
    sed -i "s/^$line_avail_cols.*/$available_cols/" "$propfile"
    

    然而,所有这些都可以在一个 awk 命令中完成,也像这样:

    awk -v val=',col6,col7,col8' -F= '$1 == "AVAIL_COLS" {
    $0 = $0 val} 1' file
    
    AVAIL_COLS=col1,col2,col3,col4,col5,col6,col7,col8
    SC_AVAIL_COLS=col1,col2,col3
    

    【讨论】:

    • 工作。没有尝试 awk,因为我不想修改其他行。
    【解决方案3】:

    您可以将sed 命令更改为以下内容,以仅匹配单行。

    available_cols=",col6,col7,col8"
    $ sed -i.bak "/^$line_avail_cols/s/$/$available_cols/" $propfile
    AVAIL_COLS=col1,col2,col3,col4,col5,col6,col7,col8
    SC_AVAIL_COLS=col1,col2,col3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多