将所有出现的冒号及其周围的值替换为选项卡

将所有出现的冒号及其周围的值替换为选项卡

谢谢您的帮助。我已经这样做了:

cat file1.txt | sed 's/1:2=//'| sed 's/1:3=//'| sed 's/1:4=//'| sed 's/1:5=//'| sed 's/1:6=//'| sed 's/2:3=//'| sed 's/2:4=//'| sed 's/2:5=//'| sed 's/2:6=//'| sed 's/3:4=//'| sed 's/3:5=//'| sed 's/3:6=//'| sed 's/4:5=//'| sed 's/4:6=//'| sed 's/5:6=//' > file2.txt

我很高兴,但现在我有一个包含更多组合的文件(16 种治疗中所有可能的组合,而不仅仅是上面示例中的 3 种),并且我不想键入所有 120 种组合。你能帮我找到一种方法,将所有出现的冒号及其周围的数字替换为空格吗?

答案1

这里的艺术是找到符合您要求的正则表达式。

例如,

sed 's/[0-9]:[0-9]=//'

将匹配您写出的所有模式,但它也会匹配3:2=,这可能不是您想要的。

但你应该能够使用,例如:

sed 's/1:[2-6]=//;s/2:[3-6]=//;s/3:[4-6]=//;s/4:[56]=//;s/5:6=//'

这已经少了很多打字。

如果您的数字大于一位数,这就会成为问题。您可以分为两种模式,例如:

s/5:[6-9]=//;s/5:1[0-6]=//

但在某些时候,工具awk似乎还是perl 更合适。

#!/usr/bin/perl
  
while (<>){
    chomp;
    if (/(.*)([0-9]+):([0-9]+)=(.*)/){
        if ($2<$3){
            print "$1$4";
        }
        else {
            print "$1$2i:$3=$4\n";
        }
    }
}

答案2

这有效!

sed 's/[0-9]*:[0-9]*=//g' file1.txt > file2.txt

干杯和感谢!

答案3

要删除所有出现的<integer1>:<integer2>=where<integer1>小于<integer2>,您可以执行以下操作:

<file perl -pe 's{(\d+):(\d+)=}{$1 < $2 ? "" : $&}ge'

对了1:2= 20:3= 5:5=,那就给了20:3= 5:5=

相关内容