【发布时间】: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" > "new.$propfile"之类的东西,从而替换grep和sed。 -
@user1934428 最初我只做
$(grep $line_avail_cols $propfile)并且由于相同的匹配而得到了两条线。谷歌给了我这个命令:D 脚本人不多 -
这当然行不通。您忘记了
^或-w(取决于您的偏好)。请参阅我在评论中给出的建议。 -
@user1934428 grep 无论如何都对我有用。从这个答案得到stackoverflow.com/a/6064412/2353403