sed는 [0-9]%로 끝나는 줄을 삭제합니다.

sed는 [0-9]%로 끝나는 줄을 삭제합니다.

stdout-stderr을 기록하는 스크립트를 작성 중입니다.

로그에는 다음의 여러 인스턴스가 포함되어 있습니다.

(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 52099 files and directories currently installed.)

[0-9]%-로 끝나는 줄을 제거하여 줄이 다음과 같이 되도록 하려면 어떻게 해야 합니까 ?

(Reading database ... 
(Reading database ... 52099 files and directories currently installed.)

나는 다양한 형태를 시도했습니다.

sed -i '/[0-9%]$/d' ~/test/Log

...탈출 %를 포함하지만 행운은 없습니다. 내가 찾은 어떤 예도 찾을 수 없습니다.

특히 그것을 사용하고 싶습니다 sed. 어떤 아이디어가 있습니까?


해당 sed -i '/[0-9%]$/d' ~/test/Log줄은 테스트 파일에서는 작동하는 것 같지만 어떤 이유로 실제 로그에서는 작동하지 않습니다.

나는 이것을 시도했습니다 /%$/d(테스트 파일에서는 작동할 수 있음). 로그에서는 작동하지 않습니다.

시도했지만 /[0-9]%$/d로그 파일에는 아무런 영향이 없습니다...


sed버전:

~ sed --version
sed (GNU sed) 4.2.2

로그 경로~/test/Log


'/[0-9]%[[:blank:]]*$/d'변경 로그도 없는 것 같습니다..

출력과 관련하여 오류가 없습니다. 파일을 분류하면 올바른 출력(줄이 제거됨)이 표시됩니다...


노트:

파일을 열었을 때 줄이 사라진 것을 발견했습니다 cat. 편집기(Sublime Text 3)에서 파일을 열었을 때 줄이 여전히 표시되었습니다.

어딘가에 스왑 파일이 있을까봐 재부팅도 해봤지만 결과는 같습니다.

답변1

%괄호 안에는 없어야 합니다. 올바른 구현은 다음과 같습니다.
sed -i '/[0-9]%$/d' ~/test/Log

답변2

파일에 제어 문자(구체적으로는 ^M)가 있는 것으로 나타났습니다.

cat표시되지 않음 ^M - 하지만 less...

출력은 less다음과 같습니다.

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... ^M(Reading database ... 5%^M(Reading database ... 10%^M(Reading database ... 15%^M(Reading database ... 20%^M(Reading database ... 25%^M(Reading database ... 30%^M(Reading database ... 35%^M(Reading database ... 40%^M(Reading database ... 45%^M(Reading database ... 50%^M(Reading database ... 55%^M(Reading database ... 60%^M(Reading database ... 65%^M(Reading database ... 70%^M(Reading database ... 75%^M(Reading database ... 80%^M(Reading database ... 85%^M(Reading database ... 90%^M(Reading database ... 95%^M(Reading database ... 100%^M(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

"(데이터베이스 읽기)" 행은 긴 문자열(^M 포함)입니다.

이 행을 삭제하면 sed전체 행이 삭제되며 이제 그 이유가 분명해졌습니다.

sed문자열 교체는 문자열의 일부를 확인하여 줄을 나누는 데 사용할 수 있습니다.

이것이 작동하는 결과입니다(^M은 문자열에서 \r입니다).

sed -i 's/(Reading database \.\.\. [0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. \r//g' ~/Desktop/Log
sed -i '/^\s*$/d' ~/Desktop/Log

줄의 지정된 부분을 "nothing"으로 바꾸고 마지막 줄은 "nothing"으로 줄을 제거합니다... 따라서 결과는 다음과 같습니다.

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

더 쉬운 방법이 있을 거라고 확신합니다. 하지만 그룹화( {[0-9],[0-9][0-9],[0-9][0-9][0-9]}) 등을 포함한 내 실험 중 아무 것도 작동하지 않습니다.

몇 시간의 혼란 끝에 나는 긴 답변을 기꺼이 받아들입니다.. :)


고쳐 쓰다

사용자돈 크리스티동일한 결과를 달성하는 보다 효율적인 솔루션이 있습니다.

sed 's/.*(Reading/(Reading/'

(...그가 게시하면 수락을 기다립니다)

답변3

이것은 직업입니다 grep:

grep -vE '[0-9]%$'

v는 의미한다V그렇지, E는두번째확장 정규식.

답변4

로그 파일 끝의 "%" 뒤에 공백, 탭 또는 기타 인쇄되지 않는 문자가 있을 수 있습니다. 노력하다:

 grep "Reading Database" ~/Test/Log | cat -A

(참고: cat -AGNU 고양이가 필요합니다. GNU sed가 있으므로 GNU 고양이가 있다고 가정합니다.)

%해당 줄 사이에 아무 것도 있으면 $이를 확인하는 것입니다. 이 경우 sed 스크립트를 다음과 같이 변경하세요.

sed -i '/Reading Database.*[0-9]+%/d'

관련 정보