[英]regex for capturing path from a string with optional character ~ (perl|awk|sed|..)
我想匹配第一个和最后一个斜杠之间的所有内容/
包括可选的~
在第一个斜杠之前。
我在第一部分使用了这个:
echo ~~a~/dir1/di r2/b.c \
| perl -pe 's/[^\/]*(\/.*\/).*/\1/'
产生/dir1/di r2/
。
这场比赛包括波浪号:
perl -pe 's/
.* (
~ \\/.*\\/).*/\\1/'
但添加?
在这些情况下,对于可选字符似乎不起作用:
perl -pe 's/
.* (
~? \\/.*\\/).*/\\1/'
-> /di r2/
perl -pe 's/
.* (
(?:~) \\/.*\\/).*/\\1/'
-> ~~a/dir1/di r2/bc
我做错了什么?
如果我正确理解了所需的输出,无论是否使用波浪号,这都适用于我
echo "path /d1/d2/43a/" | perl -nE 'm{ ( ~? (?: /.*/ | /) ) }x; say "$1"'
版画
/d1/d2/43a/
相同的 Perl 代码,在输入的第一个斜杠前有一个波浪号
echo "path ~/d1/d2/43a/" | perl -nE 'm{ ( ~? (?: /.*/ | /) ) }x; say "$1"'
版画
~/d1/d2/43a/
注释不推荐在替换中使用/1
。 请改用$1
。 使用{}
作为分隔符,我们不必转义/
,使其更具可读性(而使用除//
以外的分隔符时,我们不能在前面省略m
)。 否则,在使用/
作为分隔符然后将其转义到内部时,同样有效。
更新
为了同时捕获一个单独的~/
(或/
),最简单的更改是显式添加/.*/ | /
/.*/ | /
. 为了在这两种情况下捕获(可选) ~
,围绕此有一个(非捕获)分组。 删除了-w
标志,因此当输入字符串根本没有斜杠时不会发出警告,但只打印一个空行。
data
~~a~/dir1/di r2/b.c
/dir1/di r2/z.y
~/dir1/di r3/p.q
gobbledegook~/name/more/still/more/notwanted.c
xxx~//yyy
perl -ple 's%(?:^.*?)((?:^|~)/.*/).*%$1%' data
~/dir1/di r2/
/dir1/di r2/
~/dir1/di r3/
~/name/more/still/more/
~//
那是你需要的吗?
s%(?:^.*?)((?:^|~)/.*/).*%$1%
第一部分(?:^.*?)
是对行首任意字符序列的非捕获非贪婪匹配。
第二部分((?:^|~)/.*/)
是一个捕获表达式,它包含一个在行首或波浪号匹配的非捕获术语,后跟一个斜杠和一个贪婪的任何东西直到最后一个斜线。
尾随的.*
匹配第二部分之后的所有内容。
替换只是捕获的内容; 剩下的就是 Perl 就是 Perl。
原来的问题陈述似乎是不完整的。 显然:
对于单斜杠,它应该只输出
/
(如果存在,则带有伴随的波浪号)。 对于没有斜杠,最好是空字符串,因为没有匹配项。 ... 对于这种情况,~ab/c/df
它返回完整的字符串; 相反,它应该返回/c/
。
所以,这里有一个修改过的脚本来处理特殊的额外情况(“学习如何钓鱼”发生了什么?)。 ~ab/c/df
案例丢失了?
“字符串开头或波浪号”分组上的限定符。
data
文件~~a~/dir1/di r2/b.c
/dir1/di r2/z.y
~/dir1/di r3/p.q
gobbledegook~/name/more/still/more/notwanted.c
xxx~//yyy
not-a-slash-in-sight
just-the-one/with-extra-info
just-the~/with-more-info
~/one-slash-at-start-with-tilde
/one-slash-at-start-without-tilde
~a b/c/d.f
perl -ple 's%^[^/]*$%%; s%(?:^[^/]*?)((?:^|~)?/)[^/]*$%$1%; s%(?:^[^/]*?)((?:^|~)?/.*/).*%$1%' data
对原始表达式的轻微修改放在最后。
第一个s///
查找没有任何/
并用空替换它们。
第二个s///
查找带有斜杠的行,前面可能是波浪号或行首,然后是非斜杠到带有可选波浪号和斜杠的行尾。
匹配事件中前两个的输出与第三个s///
不匹配。
~/dir1/di r2/
/dir1/di r2/
~/dir1/di r3/
~/name/more/still/more/
~//
/
~/
~/
/
/c/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.