세 가지 명령 중 하나를 사용하고 싶습니다 sed(번호 범위)

세 가지 명령 중 하나를 사용하고 싶습니다 sed(번호 범위)

텍스트 파일이 있습니다. (테스트.txt)

1970-01-01
1971-01-01
1972-01-01
1973-01-01
1974-01-01
....
1993-01-01
1994-01-01
1995-01-01
1996-01-01
...
2015-01-01
2016-01-01

나는 위의 1995년과 1970년의 선을 지우고 싶다.

아래는 제가 만든 sed 명령입니다.

sed -i '/197[0-9]/d' test.txt
sed -i '/198[0-9]/d' test.txt
sed -i '/199[0-5]/d' test.txt

이 세 가지 명령을 하나의 sed 명령으로 결합하는 방법이 있습니까?

답변1

파일이 정렬된 것으로 나타나므로 처음부터 끝까지 삭제해도 됩니다.

예를 들어

sed -i '1,/^1995/d' test.txt

날짜가 1970년 이전에 시작하면

sed -i '/^1970/,/^1995/d' test.txt

귀하의 파일인 경우아니요가지고 있지 않다는 이유로단순한정규식(길고 지루한 정규식이 있음)은 모든 줄과 일치하지만 두 개 이상을 지정할 수 있습니다.

sed -i -e '/^19[78][0-9]/d' -e '/^199[0-5]/d' test.txt

답변2

연산의 경우 일반적으로 awk를 사용하는 것이 더 쉽습니다. 예를 들어 연도가 1970년에서 1995년 사이인 행을 제외한 모든 행을 인쇄하려면 다음을 수행합니다.

$ awk -F- '$1<1970 || $1 > 1995' test.txt
....
1996-01-01
...
2015-01-01
2016-01-01

여기에서 -F-awk에게 -필드 구분 기호로 사용하도록 지시합니다. 즉, 첫 번째 필드( 로 표시됨 $1)가 연도가 됩니다.

sed와 달리 awk는 수학 연산을 수행합니다. 따라서 $1<1970연도가 1970년보다 작으면 참입니다. $1 > 1995연도가 1995년보다 크면 참입니다. ||논리적 OR을 사용하여 이 두 조건을 결합합니다. 따라서 $1<1970 || $1 > 1995유지하고 싶은 기간도 마찬가지입니다.

답변3

이 세 가지를 정규식으로 결합할 수 있습니다.

sed -i '/19[789][0-9]/d' test.txt

세 번째 문자가 "7", "8" 또는 "9"인지 확인하세요.

선 시작 부분에 기준점을 추가할 수도 있습니다.

sed -i '/^19[789][0-9]/d' test.txt

이는 중간에 "1970" 또는 "1987"이 있는 행이 삭제되는 것을 방지하기 위한 것입니다. (일반적으로) 정규 표현식이 가능한 한 좁기를 원하므로 원하는 것만 취합니다.

관련 정보