Bash:使用亚麻布在sed

时间:2016-02-04 00:23:32

标签: regex bash sed

基本上我只需要取消注释包含特定字符串的两行。 因此,我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

如何使用行号在这种情况下工作还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式匹配作为sed中的地址,而不是行号。

sed -i '/string/s/##*//' configfile