假设我有一个包含以下条目的文件
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