Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 是否使用sed和awk替换搜索文本中的文本?_Bash_Awk_Sed - Fatal编程技术网

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

Bash 是否使用sed和awk替换搜索文本中的文本?,bash,awk,sed,Bash,Awk,Sed,我在一个文件中有一些文本,如下所示: BLAHBLAHBLAH RANDOM DATA data = [ #'oink', #'bigger oink', #'stronger oink', #'strongest oink', #'beyond godlike oink' ] BLAHAHAHA RANDOM LASDKFJS DATA 我

我在一个文件中有一些文本,如下所示:

BLAHBLAHBLAH RANDOM DATA
    data = [ 
            #'oink',
            #'bigger oink',
            #'stronger oink',
            #'strongest oink',
            #'beyond godlike oink'
        ]
    BLAHAHAHA RANDOM LASDKFJS DATA
我正在尝试删除数据数组中的所有#,在我的第一次尝试中,我尝试了以下方法:

sed -i "s/#'/'/g" file
这非常有效-但是,它在data[]范围之外进行搜索

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

awk '/data = \[/,/\]/' file | sed -i "s/# '/'/g"
这不起作用,因为sed没有获取输入文件


如何组合这些数据,或者如何使用一个命令来完成这些操作?

沿着这些行应该可以工作,但请注意,它将在任何以
data=[
开始并以
]
结束的块中替换。您并没有说您的数据文件是否可能有多个这样的块

awk '/^[ \t]*data = \[[ \t]*$/ { replacing = 1 }
     /^[ \t]*\][ \t]*$/        { replacing = 0 }
     replacing                 { sub("# '\''", "'\''") }
                               { print }
    ' < input.txt > output.txt
awk'/^[\t]*数据=\[\t]*$/{replacement=1}
/^[\t]*\][\t]*$/{replacementing=0}
替换{sub(“\”,“\”)}
{print}
“output.txt

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

awk '/^[ \t]*data = \[[ \t]*$/ { replacing = 1 }
     /^[ \t]*\][ \t]*$/        { replacing = 0 }
     replacing                 { sub("# '\''", "'\''") }
                               { print }
    ' < input.txt > output.txt
awk'/^[\t]*数据=\[\t]*$/{replacement=1}
/^[\t]*\][\t]*$/{replacementing=0}
替换{sub(“\”,“\”)}
{print}
“output.txt

使用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'

使用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'

您可以尝试此
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

您可以尝试此
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
保持简单:

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。

保持简单:

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。

我只是试图删除#符号,而不是整行。它似乎没有做任何事情
data=[#'activeCfg'、#'cellBroadcastSchedule'、#'surveyCfg'、#'targetsCfg'、#'scheduledOp']
完美。我们有一个获胜者。您需要设置
-v ORS=“
或类似设置,以避免在每次比赛后添加额外的空行。还请注意,这将替换带引号的字符串中的任何
#
以及每行开头的字符串。如果这是一个问题,那么用这种方法解决不是一件小事。好的观点@EdMorton,编辑。是的,它确实会删除起始文本块和结束文本块之间的任何位置。我早些时候试图使它安全,但它并没有在OP的所有情况下都起作用。我只是试图删除#符号,而不是整行。它似乎没有做任何事情
data=[#'activeCfg'、#'cellBroadcastSchedule'、#'surveyCfg'、#'targetsCfg'、#'scheduledOp']
完美。我们有一个获胜者。您需要设置
-v ORS=“
或类似设置,以避免在每次比赛后添加额外的空行。还请注意,这将替换带引号的字符串中的任何
#
以及每行开头的字符串。如果这是一个问题,那么用这种方法解决不是一件小事。好的观点@EdMorton,编辑。是的,它确实会删除起始文本块和结束文本块之间的任何位置。我早些时候试着让它安全,但它并没有在所有的情况下都起作用。