这是我的意见
/prj/mct/2.5/src/mode/session.v /prj/act/data/1.6/src/log.v
这里我试图从上面的路径中找到一个数值,我想在找到数值后删除所有数据/路径。预期产出
/prj/mct/2.5/. /prj/act/data/1.6/.
你能让我知道我应该如何写一个perl脚本相同的吗?
u0njafvf1#
下面的一行代码给出了预期的输出:
perl -pe 's{([^0-9]+[0-9.]+/).*}{$1.}' input.txt
-p
s{}{}
s///
[0-9]
^
[^0-9]
+
[^0-9]+
[0-9.]+
(...)
mcvgt66p2#
最简单的做法是,我们可以将数字\d+与中间的句点\.匹配,中间用斜杠括起来,保留\K部分,丢弃其余的.*:
\d+
\.
\K
.*
perl -pe 's#/\d+\.\d+/\K.*#.#' path.txt
这将与您当前的测试用例匹配,但需要句点。如果您只有一个数字,我们可以将该部分设为可选:
perl -pe 's#/\d+(?:\.\d+)?/\K.*#.#' path.txt
(?: ... )?具有?量词的非捕获括号(?:(匹配0次或1次)。使用字符类也是一个选项,例如[\d.],但请记住,这也可以只匹配句点,例如/../。
(?: ... )?
?
(?:
[\d.]
/../
perl -pe 's#/[\d.]+/\K.*#.#' path.txt
2条答案
按热度按时间u0njafvf1#
下面的一行代码给出了预期的输出:
-p
逐行读取输入,处理后打印每一行;s{}{}
是替换,我们不使用s///
,因为我们想匹配斜线,我们不喜欢反斜线斜线,因为它们很难读;[0-9]
匹配数字,^
对其求反,即[^0-9]
匹配除数字之外的任何值;+
匹配前面的结构的一个或多个出现,例如[^0-9]+
匹配一个或多个非数字;[0-9.]+
匹配数字和点,即版本;(...)
圆括号创建了一个捕获组,在这里我们捕获每行的整个开头,直到版本后面的斜杠;mcvgt66p2#
最简单的做法是,我们可以将数字
\d+
与中间的句点\.
匹配,中间用斜杠括起来,保留\K
部分,丢弃其余的.*
:这将与您当前的测试用例匹配,但需要句点。如果您只有一个数字,我们可以将该部分设为可选:
(?: ... )?
具有?
量词的非捕获括号(?:
(匹配0次或1次)。使用字符类也是一个选项,例如
[\d.]
,但请记住,这也可以只匹配句点,例如/../
。