用于查找单词并在第一次搜索时删除所有char/word的Perl脚本

mgdq6dx1  于 2022-12-13  发布在  Perl
关注(0)|答案(2)|浏览(138)

这是我的意见

/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脚本相同的吗?

u0njafvf

u0njafvf1#

下面的一行代码给出了预期的输出:

perl -pe 's{([^0-9]+[0-9.]+/).*}{$1.}' input.txt
  • -p逐行读取输入,处理后打印每一行;
  • s{}{}是替换,我们不使用s///,因为我们想匹配斜线,我们不喜欢反斜线斜线,因为它们很难读;
  • [0-9]匹配数字,^对其求反,即[^0-9]匹配除数字之外的任何值;
  • +匹配前面的结构的一个或多个出现,例如[^0-9]+匹配一个或多个非数字;
  • [0-9.]+匹配数字和点,即版本;
  • (...)圆括号创建了一个捕获组,在这里我们捕获每行的整个开头,直到版本后面的斜杠;
  • 我们用捕捉到的部分替换整行并添加一个点。
mcvgt66p

mcvgt66p2#

最简单的做法是,我们可以将数字\d+与中间的句点\.匹配,中间用斜杠括起来,保留\K部分,丢弃其余的.*

perl -pe 's#/\d+\.\d+/\K.*#.#' path.txt

这将与您当前的测试用例匹配,但需要句点。如果您只有一个数字,我们可以将该部分设为可选:

perl -pe 's#/\d+(?:\.\d+)?/\K.*#.#' path.txt

(?: ... )?具有?量词的非捕获括号(?:(匹配0次或1次)。
使用字符类也是一个选项,例如[\d.],但请记住,这也可以只匹配句点,例如/../

perl -pe 's#/[\d.]+/\K.*#.#' path.txt

相关问题