문자열의 마지막 항목을 제외하고 모두 삭제하려면 어떻게 해야 합니까?

문자열의 마지막 항목을 제외하고 모두 삭제하려면 어떻게 해야 합니까?

2016/01/30 14:52:51:마지막 항목을 제외한 모든 항목을 제거하려고 합니다 . 나는 이것을 시도했습니다 :

awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

마지막 항목을 제외한 모든 항목을 아무것도 없는 것으로 바꾸십시오. 그러나 이는 2016/01/30 14:52:51:약간 다른 숫자로 4번만 반복됩니다.

답변1

이 스크립트에는 여러 가지 문제가 있으며 문제 설명에는 몇 가지 설명이 필요합니다.

  • gsub 호출에 대한 잘못된 정규식 매개변수
  • 업데이트는 (문에 사용된 값)에 $1영향을 미치지 않습니다 .$0print
  • OP는 줄의 마지막 이벤트를 변경하지 않고 유지하려는 의도인지 아니면 날짜가 포함된 마지막 줄만 유지하려는 것인지(후자가 더 가능성이 높음) 명확하게 밝히지 않았습니다.

다음은 이러한 수정 사항과 가정이 포함된 스크립트입니다.

#!/bin/sh
awk '
BEGIN { row=0; fixup = -1; }
{
    before[row] = $0;
    gsub("2016/01/30 14:52:51: ", "", $0);
    if ( $0 != before[row] ) {
            fixup = row;
    }
    after[row++] = $0;
}
END {
    if (fixup >= 0) {
            after[fixup] = before[fixup];
    }
    for (n = 0; n < row; ++n) {
            print after[n];
    }
}
'

(두 개의 어레이를 사용하는 것은 덜 효율적이지만 before어레이를 사용하지 않는 것보다 추가 수정이 더 쉽습니다).

입력 파일( )을 생성하여 foo.in이를 테스트 했습니다.

1awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
2awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
3awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

다음과 같이 스크립트를 실행하십시오.

./foo <foo.in

그리고 얻었습니다

1awk '{gsub(//,"",$1);print}'
2awk '{gsub(//,"",$1);print}'
3awk '{gsub(//,"",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

답변2

내 기여는 Thomas Dickey의 AWK에 대한 POSIX 호환 대체물이며 동일한 가정을 합니다.

printf '%s\n' '1;?2016/01/30 14:52:51: ?' '1,.-g//s///' w q | ed filename

파일을 뒤로 탐색하는 ed의 기능은 이 작업을 매우 빠르게 만듭니다.

관련 정보