删除单行中多次存在的两个符号之间的模式

删除单行中多次存在的两个符号之间的模式

我有许多类似于以下文件的文件(我将其称为file1):

(((1824663.AST0201.AST0202.AST0016...AST0087:0.2575,225845.AST0201.AST0202.AST0016...AST0087:0.717227):0.45328,190304.AST0201.AST0202.AST0016...AST0087:...........

我想删除之前和之后AST*之间的所有内容,这些内容总是在最后一个之后。这种模式在一行中多次出现。这里显示的内容是完全重复的,但是我有更多这样的带有不同的行。.AST*:.AST*AST*AST

我目前正在做的是拆分文件,删除所有内容AST,然后将每一行连接成一行。

sed 's/:/:\n/g;s/,/,\n/g' file1 | sed 's/\.AST.*:/:/g' | sed -z 's/\n//g'

预期输出:

(((1824663:0.2575,225845:0.717227):0.45328,190304:...........

有没有更短的命令来要求sed这个?

答案1

你可以试试这个sed

$ sed -E 's/\.AST[^:]*//g' input_file
(((1824663:0.2575,225845:0.717227):0.45328,190304:...........

答案2

使用(以前称为 Perl_6)

~$ raku -pe  's:g/ [ AST \d+ ]+ % \.+ //;'  file

输入示例:

(((1824663.AST0201.AST0202.AST0016...AST0087:0.2575,225845.AST0201.AST0202.AST0016...AST0087:0.717227):0.45328,190304.AST0201.AST0202.AST0016...AST0087:...........

示例输出:

(((1824663.:0.2575,225845.:0.717227):0.45328,190304.:...........

Raku 是 Perl 系列编程语言。这里,-pe使用了熟悉的自动打印逐行标志(类似 sed)。上面的正则表达式是假设.点是记录或元素分隔符而编写的。因此,不寻找.AST而是保持前导.点不变更有意义。

Raku 正则表达式的一个新功能是重复元素的修改量词。简单地说,如果你有一个像 的模式 AST \d+,你可以用括号将其分组为[ AST \d+ ],然后添加一个量词来指示重复次数:[ AST \d+ ]+

通常,上面的代码只会识别同时运行的模式的多个实例,但是您现在可以使用修饰量词指示符% \.+,用于指示[ AST \d+ ]模式(“由一个或多个点%分隔”)。这种构造避免了仅使用可选正则表达式时出现的问题,即分隔符丢失并且诸如(如果真实)之类的模式被删除。此外,修改后的量词可用于删除除第一个或除最后一个之外的所有目标元素:\.+.\.?AST0AST1

输入示例:

echo '(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303:AST0401.AST0402.AST0403.AST0404:)))' > test_AST.txt

一行行和输出(插入空格):

~$ raku -pe  's:g/ [ AST \d+ ]+  //;' test_AST.txt
(((1824663.:.:..:...:)))
 
~$ raku -pe  's:g/ [ AST \d+ ]+ % \.  //;' test_AST.txt
(((1824663.::::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**2..* % \.  //;' test_AST.txt
(((1824663.AST0101::::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**3..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**4..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**5..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303:AST0401.AST0402.AST0403.AST0404:)))

https://docs.raku.org/language/regexes
https://raku.org

相关内容