모든 콜론 발생과 그 주변 값을 탭으로 대체 [닫기]

모든 콜론 발생과 그 주변 값을 탭으로 대체 [닫기]

도움을 주셔서 감사합니다. 나는 이것을 했다:

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

만족하지만 이제 더 많은 조합(위 예의 3개뿐 아니라 16개 치료에서 가능한 모든 조합)이 포함된 파일이 있고 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>=항목 을 제거하려면 다음을 수행할 수 있습니다.<integer1><integer2>

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

그건 그렇고 1:2= 20:3= 5:5=, 내가 줄게 20:3= 5:5=.

관련 정보