bash-用sed更改配置文件



我一直在更改名为" .backup.conf"的shell脚本的问题。

配置文件看起来像这样:

inputdirs=(/etc /etc/apm /usr/local)
outputdir="test_outputdir"
backupmethod="test_outputmethod"
loglocation="test_loglocation"`

我的脚本需要更改配置文件变量之一,而我对最后3个变量没有任何麻烦。

如果我想更改变量" inputdirs"/etc/to/etc/perl,我应该使用什么表达式?

如果我将Echo与Append一起使用,则只会将其附加到文件的末尾。

我尝试使用以下格式使用SED: sed -i 's/${inputdirs[$((izbor-1))]}/$novi/g' .backup.conf其中" izbor"是我想从inputdirs更改的变量,而" novi"是新路径(例如/etc/perl)。

因此,使用以下配置文件,并且使用变量$izbor=1$novi=/etc/perl,我应该将第一个变量inputdirs=/etc更改为/etc/perl并且变量输入最终应该看起来像inputdirs=(/etc/perl /etc/apm /usr/local)

谢谢您的帮助!

您可以尝试以下方法:

enovi="$(printf '%sn' "$novi" | sed -e 's/[\&/]/\&/g')"
izbor1="$(expr "$izbor" - 1)"
sed -rie "s/([(]([^ ]* ){$izbor1})[^ )]*/\1$enovi/" config.txt

命令的摘要:

  1. 第一行生成一个具有$novi的ESC_8的变量$enovi。基本上,逃脱了以下字符:&/。因此/etc/perl变为/etc/perl
  2. 我们创建了一个新的变量减少$izbor
  3. 这是实际的替代表达。我会以部分解释:
    1. 首先,我们匹配括号字符[(]
    2. 现在,我们将搜索一系列非空间,然后是一个空间([^ ]*)。
    3. 此搜索(通过内括号中的分组来识别)重复$izbor1次({$izbor1}
    4. 先前的表达式分组为外括号组,以便将其捕获到辅助变量1中。
    5. 我们现在匹配要替换的单词。它是由一系列不是空格而不是闭合括号的字符形成的(这是处理最后一个单词的情况)
    6. 替换由捕获的值1形成,然后是我们的新字符串。

希望这有帮助=)

如果您要使用$ izbor作为索引,它可能希望成为s///的标志。假设您的输入匹配^inputdirs=((没有空格),您可能可以摆脱:

sed -i '/^inputdirs=(/{ 
    s/(/(  /; s/)/ )/;   # Insert spaces inside parentheses
    s@ [^ ][^ ]* @ '"$novi@$izbor"'; 
    s/( /(/; s/ )/)/; }  # Remove inserted spaces
' .backup.conf

前两个表达式确保您在括号内有空格,因此,如果您的输入已经在那里有空格,则可能无需。上面有些混淆,但基本上您要做的替代品是:

s@ [^ ][^ ]* @/etc/perl@2

2标志告诉SED仅替换比赛的第二次出现。这确实是脆弱的,因为它在inputdirs之前不需要空格,并且在Parens内部不需要空格,并且不处理标签,但它应该适合您。另外,一些sed允许[^ ][^ ]*更简单地写成[^ ]+,但这不是通用。

相关内容

  • 没有找到相关文章