提取“[0-9].”之后的所有内容,直到 unix 命令中的行结束

提取“[0-9].”之后的所有内容,直到 unix 命令中的行结束

假设我有一个包含以下条目的文件

5. variable1:
10. variable7:
230. variable21803:

我想将所有变量作为输出而不使用“5。”等。我尝试过的是

grep -Po '(?<=^[0-9] )[.\n]+

但是,这不会返回任何结果。我对 unix 比较陌生,所以任何帮助将不胜感激。

这是前面有空格的更新测试

    ranodm text 
   1. variable1:
   2. variable10:
   3. variable302:

答案1

grep实用程序不太适合行内编辑。它的标准用法是提取与特定正则表达式或字符串匹配的行。编辑sed器更常用于进行此类编辑。

以下命令显示如何使用sed删除文件每行第一个空格字符之前的所有内容:

$ sed 's/[^ ]* //' file
variable1
variable7
variable21803

该表达式s/[^ ]* //匹配零个或多个非空格字符,后跟一个空格。然后它将匹配的子字符串替换为空(即删除它)。

如果您需要在行首匹配一个整数,后跟一个空格前的点,您可以这样做:

$ sed 's/^[[:digit:]]*\. //' file
variable1
variable7
variable21803

这匹配行开头的零个或多个数字,后跟一个点和一个空格。如果匹配,这些将被删除。


更新后的问题要求一些完全不同的东西,其中包括删除每行两端的数据。

您可以通过多种方式执行此操作,下面的命令显示如何删除行的第一位,直到最后一个空格,然后删除:以 结尾的所有行上的最后一个:, ,给出问题中的数据:

$ sed '/:$/ { s///; s/.* //; }' file
    ranodm text
variable1
variable10
variable302

或者,如果您不想要开头的随机文本:

$ sed -n '/:$/ { s///; s/.* //p; }' file
variable1
variable10
variable302

答案2

使用 Raku(以前称为 Perl_6)

raku -e 'lines.comb(/ variable \d+ /).join("\n").put;' 

输入示例:

5. variable1:
10. variable7:
230. variable21803:

    ranodm text 

   1. variable1:
   2. variable10:
   3. variable302:

示例输出:

variable1
variable7
variable21803
variable1
variable10
variable302

上面是用 Raku 编码的解决方案,Raku 是 Perl 编程语言家族的成员。简而言之,Raku 提供了一个comb采用/…/正则表达式匹配器的例程。当在命令行调用时,lines将进行读取、comb-ed 查找(空白无关紧要的)variable \d+模式,并返回匹配项。

join("\n")如果您希望在一行中返回所有匹配项,请删除该调用:

raku -e 'lines.comb(/ variable \d+ /).put;' file
variable1 variable7 variable21803 variable1 variable10 variable302

当然,Raku 中还有其他可用的解决方案,包括使用熟悉的s///替换运算符的解决方案(如sed本线程中其他位置发布的解决方案)。下面是另一种 Raku 解决方案,它保留了行距:

raku -ne 'put m:g/ [variable \d+] /;' file
variable1
variable7
variable21803



variable1
variable10
variable302

https://raku.org

相关内容