Bash:如果行包含指定的子字符串,则从行的开头删除#

时间:2017-01-05 12:30:25

标签: bash sed

我有一个带依赖项的文件。一些依赖项被注释(#)。我想取消注释该行,如果它包含子串cassandra。 所以如果文件看起来像:

firstdependency>=2.0.7 # comment
otherdependency>=0.8.9 # another comment
#commenteddependency
#cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0
anotherdependency!=0.18.3,>=0.18.2

我想要一个只会将第四行改为

的脚本
cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0

因此它应该检查一行是否包含子串cassandra,如果是,检查该行的第一个字符是否等于#,如果是,则删除该特定行的第一个字符 - 完成。我不知道该怎么做。救命啊!

4 个答案:

答案 0 :(得分:2)

嗯,你知道从sed开始,那么这只是一个正确的替换命令。

sed -e "s/^#\(.*cassandra.*\)$/\1/"

找到符合以下规则的行:

  1. #开头,
  2. 含有" cassandra"某处(前后允许任意字符序列),
  3. 将所有其余行(#除外)存储在临时\1中(\( ... \)执行的操作)并被指示仅用后者替换这样一条线。

    如果需要,可以进一步改进,例如不寻找" cassandra"在第二次出现#之后,我认为您的示例中的结尾注释会被您添加并且不会成为问题。

    示例输出:

    firstdependency>=2.0.7 # comment
    otherdependency>=0.8.9 # another comment
    #commenteddependency
    cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0
    anotherdependency!=0.18.3,>=0.18.2
    

答案 1 :(得分:1)

简单地使用标准编辑器printf '%s\n' 'g/^#.*cassandra/s/^#/' w | ed -s file >/dev/null

g/^#.*cassandra/

命令#标记以cassandra开头且包含字符串s/^#/的所有行,#删除这些标记行中的前导<span ng-show="myAngApp1.value == customer.LSpanish">

答案 2 :(得分:1)

在awk中。如果记录以#开头且上面有cassandra,请删除前导#打印所有记录:

$ awk '/^#/ && /cassandra/ { sub(/^#/,"") } 1' file
firstdependency>=2.0.7 # comment
otherdependency>=0.8.9 # another comment
#commenteddependency
cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0
anotherdependency!=0.18.3,>=0.18.2

答案 3 :(得分:0)

您的脚本应该只包含以下行:

sed -e 's/#cassandra/cassandra/' your_file

正则表达式///将一种模式替换为另一种模式,在这种情况下&#39; #cassandra&#34; by&#34; cassandra&#34;。