使用sed和awk替换搜索文本中的文本?

时间:2016-07-29 18:17:57

标签: bash awk sed

我在文件中有一些文字如下:

BLAHBLAHBLAH RANDOM DATA
    data = [ 
            #'oink',
            #'bigger oink',
            #'stronger oink',
            #'strongest oink',
            #'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA

我试图删除数据数组中的所有内容,在我第一次尝试时尝试了这个:

sed -i "s/#'/'/g" file

这很有效 - 但是,它在数据[]范围之外搜索。

然后我尝试将awk与sed结合起来:

awk '/data = \[/,/\]/' file | sed -i "s/# '/'/g"

这不起作用,因为sed没有获得输入文件。

如何组合这些,或者如何使用一个命令进行组合?

4 个答案:

答案 0 :(得分:1)

使用gnu awk你可以这样做:

cat file

# text
BLAHBLAHBLAH RANDOM DATA
    data = [
            #'oink',
            #'bigger oink',
            #'stronger oink',
            #'strongest oink',
            #'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA

            #'stronger oink',
            #'strongest oink',

# awk command
awk -v RS='data *= *\\[[^]]*\\]' '{gsub(/#/, "", RT); print $0 RT}' ORS= file

# text    
BLAHBLAHBLAH RANDOM DATA
    data = [
            'oink',
            'bigger oink',
            'stronger oink',
            'strongest oink',
            'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA

            #'stronger oink',
            #'strongest oink',
            #'beyond godlike oink'

答案 1 :(得分:1)

保持简单:

awk '/data = \[/{f=1} f{sub(/#/,"")} /\]/{f=0} 1' file

例如,借用@ anubhava的输入和按摩以在引用文本中包含#的行:

$ cat file
# text
BLAHBLAHBLAH RANDOM DATA
    data = [
            #'oink',
            #'bigger oink',
            #'stronger oink',
            #'mother #$^*@ oink',
            #'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA

            #'stronger oink',
            #'strongest oink',

$ awk '/data = \[/{f=1} f{sub(/#/,"")} /\]/{f=0} 1' file
# text
BLAHBLAHBLAH RANDOM DATA
    data = [
            'oink',
            'bigger oink',
            'stronger oink',
            'mother #$^*@ oink',
            'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA

            #'stronger oink',
            #'strongest oink',

以上内容适用于任何操作系统上的任何awk。

答案 2 :(得分:0)

这些行中的某些内容应该有效,但请注意它将在以data = [开头并以]结尾的任何块中替换。你并没有真正说出你的数据文件是否有多个这样的块...

awk '/^[ \t]*data = \[[ \t]*$/ { replacing = 1 }
     /^[ \t]*\][ \t]*$/        { replacing = 0 }
     replacing                 { sub("# '\''", "'\''") }
                               { print }
    ' < input.txt > output.txt

答案 3 :(得分:0)

您可以试试sed

sed "/^\s*data = \[/{:loop; /\]/b; n; s/#'/'/g; t loop}" file

<强>测试

$ sed "/^\s*data = \[/{:loop; /\]/b; n; s/#'/'/g; t loop}" file
BLAHBLAHBLAH RANDOM DATA
    data = [ 
            'oink',
            'bigger oink',
            'stronger oink',
            'strongest oink',
            'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA