sed查找并替换由[]输出到文件包围的字符串

sed查找并替换由[]输出到文件包围的字符串,sed,Sed,有一个包含以下内容的文件 "SCAN_IN[0]" : input; 要使用sed查找并替换为扫描\u 0吗 我正在使用以下命令 sed 's/SCAN_IN[]0[]/scan_0/' fileA > fileB 这就是我得到的 "scan_00]" : input; 我想要 "scan_0" : input; []0[]模式中的SCAN\u首先匹配SCAN\u,然后[]0[]匹配一个字符:要么],要么0,要么[/code>(由于未被替换的]正好位于打开的括号表达式[/code

有一个包含以下内容的文件

"SCAN_IN[0]" : input;
要使用sed查找并替换为扫描\u 0吗

我正在使用以下命令

sed  's/SCAN_IN[]0[]/scan_0/' fileA > fileB
这就是我得到的

"scan_00]" : input;
我想要

"scan_0" : input;

[]0[]模式中的
SCAN\u首先匹配
SCAN\u
,然后
[]0[]
匹配一个字符:要么
]
,要么
0
,要么
[/code>(由于未被替换的
]
正好位于打开的括号表达式
[/code>(或
[^
是否为反括号表达式)被视为文字
]
而不是右括号表达式(char)

在字符串中,[]0[]
中的
SCAN\u与[
中的
SCAN\u匹配,因此替换的结果是SCAN\u 0
0]”:input;

你可以用

sed 's/SCAN_IN\[0]/scan_0/' fileA > fileB
见:

s=“[0]中的扫描”:输入;'

sed的/SCAN_IN\[0]/SCAN_0/”我将做一些假设:

您希望用
中的
“SCAN\u[?]”
替换为
“SCAN\u?”
,其中
可以是任何(零个或多个)连续的非右括号字符字符串。这意味着(至少)三件事:必须将输入中的大写转换为输出中的小写(这很奇怪);双引号是匹配模式的一部分-因此只匹配SCAN_IN,但不匹配例如RESCAN_IN;并且您希望对括号内的任何内容执行此操作,而不仅仅是对单个字符
0

此外,您不关心模式出现在何处(无论是在附加文本之前,如
:input
,还是其他任何地方),即使模式在同一行上出现多次,您也必须进行相同的更改。(因此,我们需要
g
标志。)

sed
命令可以执行以下所有操作:

sed -E 's/"SCAN_IN\[([^]]+)]"/"scan_\1"/g'
以下是几个例子:

$ echo '"SCAN_IN[0]" : input' | sed -E 's/"SCAN_IN\[([^]]*)]"/"scan_\1"/g'

"scan_0" : input


$ echo '"TO_SCAN_IN[0]" : input' | sed -E 's/"SCAN_IN\[([^]]*)]"/"scan_\1"/g'

"TO_SCAN_IN[0]" : input



$ echo '"SCAN_IN[0]" : input "RESCAN_IN[1]" "SCAN_IN[37]" "SCAN[0]"' | 
                                 sed -E 's/"SCAN_IN\[([^]]+)]"/"scan_\1"/g'

"scan_0" : input "RESCAN_IN[1]" "scan_37" "SCAN[0]"

使用\[0]/SCAN\u 0/'fileA>fileB
中的
sed's/SCAN\u。为什么要使用
[]
?或
tr-d'[]'
您只想对索引0或方括号中可能出现的任何数字执行此操作?此外,SCAN\u应该是一个完整的单词(可能是数组名),或者如果将[0]
中的
RESCAN_更改为
RESCAN_0
,“正确的解决方案“也将进行更改-它不会检查
SCAN_IN
是否是一个完整的单词。@WiktorStribiżew-我很确定OP想要捕获所有的开始括号和结束括号以及数字0-但他没有在字符类后使用量词。关于您的解决方案(以及缺少的字符),请参阅我上面的评论。”“请求OP澄清”,然后再发布您的答案。@Cyrus-OP还需要从数组名称中删除
中的
一词。如果不干扰其他内容,您将无法使用
tr
。(事实上,如果字符串中还有其他括号,那么解决方案也会因此给出错误的答案。)
$ echo '"SCAN_IN[0]" : input' | sed -E 's/"SCAN_IN\[([^]]*)]"/"scan_\1"/g'

"scan_0" : input


$ echo '"TO_SCAN_IN[0]" : input' | sed -E 's/"SCAN_IN\[([^]]*)]"/"scan_\1"/g'

"TO_SCAN_IN[0]" : input



$ echo '"SCAN_IN[0]" : input "RESCAN_IN[1]" "SCAN_IN[37]" "SCAN[0]"' | 
                                 sed -E 's/"SCAN_IN\[([^]]+)]"/"scan_\1"/g'

"scan_0" : input "RESCAN_IN[1]" "scan_37" "SCAN[0]"