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 -A
GNU 고양이가 필요합니다. GNU sed가 있으므로 GNU 고양이가 있다고 가정합니다.)
%
해당 줄 사이에 아무 것도 있으면 $
이를 확인하는 것입니다. 이 경우 sed 스크립트를 다음과 같이 변경하세요.
sed -i '/Reading Database.*[0-9]+%/d'