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