谢谢您的帮助。我已经这样做了:
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=
。