Rod*_*oAP 3 regex perl awk sed
我有一个旧的应用程序,它会生成类似以下内容的内容:
USERLIST (
"jasonr"
"jameso"
"tommyx"
)
ROLELIST (
"op"
"admin"
"ro"
)
Run Code Online (Sandbox Code Playgroud)
我需要某种形式的正则表达式,仅将USERLIST部分更改为USERLIST("jasonr", "jameso", "tommyx"),其余文本保持不变:
USERLIST("jasonr", "jameso", "tommyx")
ROLELIST (
"op"
"admin"
"ro"
)
Run Code Online (Sandbox Code Playgroud)
除了多行问题之外,我不知道如何处理仅部分字符串的替换。我尝试过perl( -0pe)和sed,找不到解决方案。我不想写一个应用程序来做到这一点,当然有办法......
perl -0777 -wpe'
s{USERLIST\s*\(\K ([^)]+) }{ join ", ", $1 =~ /("[^"]+")/g }ex' file
Run Code Online (Sandbox Code Playgroud)
在显示的输入文件上打印所需的输出。断线以便于查看。
使用-0777switch时,整个文件会立即读入字符串(“slurped”),因此位于$_. 使用/x修饰符时,模式中的文字空格将被忽略,因此可用于提高可读性。
解释
捕获接下来的内容USERLIST (,直到第一个右括号。这假设内部没有这样的括号USERLIST( ... )。使用\Klookbehind,所有之前的匹配都会保留(不会从字符串中“消耗”)并且被排除在外$&,因此我们不必在替换端重新输入它们
替换端被评估为代码,由/e修饰符提供。在其中,我们捕获初始捕获中的所有双引号子字符串$1(假设没有嵌套引号)并通过 加入该列表, 。然后使用获得的字符串替换下面括号中的内容USERLIST