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 00]”: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]"