我有一个包含HTTP /数据库URL的属性文件,如下所示:
http://localhost:8888/some_user?holiday=true
jdbc:hsqldb:hsql://localhost:9999/another_user?holiday=true&paid=true
jdbc:mysql://localhost:8888/some_user
http://localhost/some_user
每个网址都显示在单独的一行中。
每一行都可以以空格(空格/制表符),\n
或任何内容结尾(如果它是最后一行)。
行之间的差异:
我想用XXXX
替换端口号(如果存在)和用户名。
例如,之前的网址应为:
http://localhost:XXXX/XXXX?holiday=true
jdbc:hsqldb:hsql://localhost:XXXX/XXXX?holiday=true&paid=true
jdbc:mysql://localhost:XXXX/XXXX
http://localhost/XXXX
以下是我所做的:
我将其分解为两个正则表达式...如果我想使用环顾四周,我将不得不这样做:
替换端口号(如果存在):
perl -i -0777 -pe 's/(?<=localhost:)\d+/XXXX/g' file;
然后,替换用户名:
perl -i -0777 -pe 's/(?<=localhost\/)(?<=localhost:XXXX\/)[\S&[^?]]*(?=[?\s\Z]?)/XXXX/g' file;
第二个正则表达式没有替换用户名......任何想法有什么问题?
此外,还有一种简单的方法可以考虑最后一行的情况,它可能不会以换行符等空格结尾。
答案 0 :(得分:3)
为什么要打扰正则表达式? URI模块可以为您完成所有操作:
{{1}}
答案 1 :(得分:2)
鉴于URL解析的复杂性,最好使用URI模块。
这是一个两遍正则表达式。第一个正则表达式匹配第一个/
或:
(在协议标识符之后),后跟:
和数字; \K
使它删除所有先前的匹配,因此只替换端口。第二个正则表达式替换了第一个?
之后的所有连续非/
。
perl -ple'
s{^ [^:]* :// [^/:]* : \K \d+ }{XXXX}x;
s{^ [^:]* :// [^/]* \K [^?]* }{/XXXX}x;
' input > output
没有必要运行两个单行,因为这严格按行进行。更正了ikegami的代码。
更新问题更新
正确处理多个协议,并将正则表达式的更改开始为
s{^ .*? :// ...
以匹配第一个://
的内容,包括第一个CREATE TABLE Ages (name VARCHAR(128),age INTEGER)`
DELETE FROM Ages;
INSERT INTO Ages (name,age) Values ('Alex',25);
INSERT INTO Ages (name,age) Values ('Mel',31);
INSERT INTO Ages (name,age) Values ('Fred',30);
INSERT INTO Ages (name,age) Values ('Nancy',35);
INSERT INTO Ages (name,age) Values ('Nathan',13);
INSERT INTO Ages (name,age) Values ('Oscar',24);
SELECT hex (name||age) AS X FROM Ages ORDER BY X
SELECT * FROM X LIMIT 1
UPDATE X SET name = '53656C696E613333'
。其余的都一样。