使用sed检索和修改文件中的单行

时间:2014-05-30 14:32:53

标签: bash replace sed grep comments

我有一个bash脚本,需要从文件中注释掉第一个非注释行并显示它,如下所示:

env=$(grep -v -m 1 "#" file)
if [ "$env" != "" ]
then
    sed -i "/\<$env\>/s/^/#/" file
fi
echo $env

这转变了:

#this is an example file
this is the first line
this is the second line

进入这个:

#this is an example file
#this is the first line
this is the second line

并回复此this is the first line

我相信有一种更直接,规范的方式,可能只使用sed。它是一个单行的方便,因为它实际上是通过ssh执行的。另一方面,在ssh上执行会导致在sed参数中扩展环境变量时出现问题,并且使用\\\$env转义它不起作用。任何建议都非常感谢。

4 个答案:

答案 0 :(得分:1)

正如您的建议,您只能使用sed

sed '0,/^[^#]/ s/^[^#].*/#\0/' file.txt

上面的sed命令适用于从文件中的第一行到第一个未注释的行的范围。在此范围内,它用#替换未注释行的开头。因为范围只适用于第一个未注释的行,所以只会注释这个。

答案 1 :(得分:1)

假设您使用的是枪sed

sed -i '/^[^#]/{s/^/#/;:S;N;bS;}' file

当匹配第一个非评论行时,它会在行前添加#并读取剩余行。 因为它会读取到PatternSpace的剩余行,如果这是一个大文件并且在第一个非注释行之后有许多行,它将占用大量内存。

最好的答案是luis_js,我仍然在这里写我的答案只是提供一种不同的方式。

自从OP提到以来,我在这里保留了我的第一个答案(但这是错误的)

sed '/^#/{n;s/^/#/;}' file

它会在注释行后推荐这些行,并且只有在有奇数注释行强制第一个非注释行时才可以注释第一个非注释行。

答案 2 :(得分:1)

如果您找到带#的行,请转到下一行。 如果下一行以#开头,则转到下一行,否则添加#

sed -e '/#/{:start; n; /^#/b start; s/^/#/}; '  file.txt

答案 3 :(得分:0)

有一个答案,但它被删除了。我认为值得一提的是,出于教育目的:

sed -i '/^#/{n;s/^/#/}' file

这是最短的代码,但是它评论了评论。 (你得到&#34; ##&#34;在文件中)。因此,如果其他人在他们的特定场景中没有想到这一点,它仍然有用......