基本上我只需要取消注释包含特定字符串的两行。 因此,我grep字符串以获取行号并使用sed取消注释 (确定也可以使用sed获取行号,但问题是相同的。)
你得到的每一行都有自己的行号,我不知道如何处理自己行上的行号,所以我试图让它们成一行来使用bash变量来处理行号:
$ cat configfile
some text
#a string foo
#b string bar
some other text
#more text
much more text
所以我的第一次尝试是:
linenr=$(grep -n string configfile | cut -d: -f1) # get line numbers (several lines)
linenr=(${linenr//\ / }) # put line numbers into one line
sed -i "${linenr[0]},${linenr[1]} s/##*//" configfile # uncomment lines
我的第二次尝试是:
linenr=$(sed -n '/string/=' configfile) # get line numbers (several lines)
linenr=$(echo $linenr | sed -i 's/\n/ /' configfile) # put line numbers into one line
sed -i "${linenr[0]},${linenr[1]} s/##*//" configfile # uncomment lines
我需要做两次,两个几乎相似的配置文件,由于某种原因,我得到不同的行号输出,尽管两个配置文件的代码是相同的:(适用于configfile4但不适用于configfile6?我假设这些文件的内容与找到的行号的输出无关?还检查行结尾,两个文件都相同)
configfile4lines:
44 45
configfile6lines:
54
55
如何使用行号在这种情况下工作还是有更好的方法来做到这一点?
答案 0 :(得分:2)
您可以使用正则表达式匹配作为sed
中的地址,而不是行号。
sed -i '/string/s/##*//' configfile