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,编辑。是的,它确实会删除起始文本块和结束文本块之间的任何位置。我早些时候试着让它安全,但它并没有在所有的情况下都起作用。