我希望将出现的每个';‘转换为'@',但前提是没有引号(丢弃此行中的引号)。背后的原因:
arm-asm的汇编语言语法有';‘作为注释符号,后面的所有内容都是注释。尽管有像";“或”;“这样的东西。
我建议使用以下sed脚本作为解决方案,并将其放在讨论中,以防我忽略了什么:
文件% s:
s/^\([^(;\'\")]*\)\(;\)\(.*$\)/\1@\3/文件测试用例:
;
;
;**********;****
';'
";"
';'
";"
ABC r1,';'
ABC r1,";"
; ";" ';'
;;;用法:
$ sed -f s testcase
@
@
@**********;****
';'
";"
';'
";"
ABC r1,';'
ABC r1,";"
@ ";" ';'
@;;编辑:我只是发现,例如
.include "stm32f407.s" ; target register defines
.set PLLP, (DIVP - 2) / 2 ; some other comment没有通过测试。
编辑:
因此,希望现在可以这样做:
#!/bin/sh
sed -e "s/^\([^(;\'\")]*\)\(;\)\(.*$\)/\1@\3/" -e "s/^\([^;]*\)\(;\)\(.*\)/\1@\3/" $1注意:该脚本适用于BSD sed (例如macOS),而不是GNU sed。
发布于 2020-10-15 21:40:01
使用perl (如果perl可用,它比sed更可移植)
perl -pe 's/(?:\x27;\x27|";")(*SKIP)(*F)|;/@/'(?:\x27;\x27|";")(*SKIP)(*F)任何满足(?:\x27;\x27|";")的文本都不会被更改,十六进制alternateg指定应该作为(?:\x27;\x27|";")g perl -i.bkp更改的内容如果您想要替换所有这样的文本如果您想要就地编辑(如果您不想备份,只需-i )发布于 2020-10-15 19:38:33
这可能适用于您(GNU sed):
sed -E 's/(["'\'']);\1/\1\n\1/g;s/;/@/;y/\n/;/' file将引号或双引号之间的所有;替换为换行符。
将第一次出现的;替换为@
将所有换行符替换为;。
注意:要替换所有匹配项,请使用:
sed -E 's/(["'\'']);\1/\1\n\1/g;y/;/@/;y/\n/;/' file此解决方案可能适用于所有sed版本:
sed -Ee 'G
:a
s/(["'\'']);(\1.*(.))/\1\3\2/
ta
s/;/@/
:b
s/(.)(.*\1)$/;\2/
tb
s/.$//' file它利用了一个空的保留空格附加一个换行符的事实,即G命令附加一个换行符,这可以被捕获并在替换中使用。
https://stackoverflow.com/questions/64368280
复制相似问题