我在文件中有一些文字如下:
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没有获得输入文件。
如何组合这些,或者如何使用一个命令进行组合?
答案 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