2014-09-09 3 views
1

파일에서 알 수없는 문자와 빈 줄을 제거해야합니다. 간단해야하며 실제로 할 수 없다는 것이 정말 어리 석습니다. 아직. 어떤 이유로SED, TR 또는/및 awk로 원하지 않는 문자 및 빈 줄을 제거합니다.

136;2014-09-07 13:41:25;2014-09-07 13:41:55 
    136;2014-09-07 13:41:55;2014-09-07 13:42:25 
    136;2014-09-07 13:42:25;2014-09-07 13:42:55 
    (empty line) 
    (empty line) 

이 파일은 여러 가지 원치 않는/알 수없는 문자와 함께 제공 :

여기에 파일 (읽기) 내용입니다. 16 진수는 다음과 같습니다.

fffe 3100 3300 3600 3b00 3200 3000 3100 3400 2d00 3000 3900 :..1.3.6.;.2.0.1.4.-.0.9. 
    2d00 3000 3700 2000 3100 3300 3a00 3400 3100 3a00 3200 3500 :-.0.7. .1.3.:.4.1.:.2.5. 
    3b00 3200 3000 3100 3400 2d00 3000 3900 2d00 3000 3700 2000 :;.2.0.1.4.-.0.9.-.0.7. . 
    3100 3300 3a00 3400 3100 3a00 3500 3500 0d00 0a00 3100 3300 :1.3.:.4.1.:.5.5.....1.3. 
    3600 3b00 3200 3000 3100 3400 2d00 3000 3900 2d00 3000 3700 :6.;.2.0.1.4.-.0.9.-.0.7. 
    2000 3100 3300 3a00 3400 3100 3a00 3500 3500 3b00 3200 3000 : .1.3.:.4.1.:.5.5.;.2.0. 
    3100 3400 2d00 3000 3900 2d00 3000 3700 2000 3100 3300 3a00 :1.4.-.0.9.-.0.7. .1.3.:. 
    3400 3200 3a00 3200 3500 0d00 0a00 3100 3300 3600 3b00 3200 :4.2.:.2.5.....1.3.6.;.2. 
    3000 3100 3400 2d00 3000 3900 2d00 3000 3700 2000 3100 3300 :0.1.4.-.0.9.-.0.7. .1.3. 
    3a00 3400 3200 3a00 3200 3500 3b00 3200 3000 3100 3400 2d00 ::.4.2.:.2.5.;.2.0.1.4.-. 
    3000 3900 2d00 3000 3700 2000 3100 3300 3a00 3400 3200 3a00 :0.9.-.0.7. .1.3.:.4.2.:. 
    3500 3500 0d00 0a00 0000 0d00 0a00       :5.5........... 

따라서 처음 2 바이트는 xFF와 xFE이며 각 문자 뒤에는 많은 x00이 있습니다. 줄 끝은 0D00 + 0A00, 캐리지 리턴 및 줄 바꿈 (\r\n) + x00의 조인입니다.

x00과 처음 2 바이트 인 xFFxFE과 마지막 4 개를 제거하고 CRLFLF으로 변환하고 싶습니다.

내가 할 수있는 머리, 꼬리와 TR을 사용하여 :

tr -d '\15\00' < 2014.log | tail -c +3 | head -c -2 > 3.log 

문제는 내가 파일은 항상 이런 식으로 도착할 것입니다 있는지 확실하지 않습니다, 그래서 더 일반적인 방법을 구축 할 필요가있다 . 내가 함께 결국 :

sed 's/\xFF\xFE//g; s/\x00//g; s/\x0D//g' 2014.log > 2.log 
    or 
    tr -d '\377\376\00\15' <2014.log> 2.log 

지금 내가 처음에 말했듯이, 쉽게해야하는 마지막 두 개의 빈 줄을 제거해야하지만 나는 그것을 달성 할 수 없다.

sed '/^\s*$/d' 
    sed '/^$/d' 
    awk 'NF > 0' 
    egrep -v "^$" 
    Other stuff 

을하지만 결국에 난 아직도 결국 하나 X0A이 만 빈 줄 중 하나를 제거합니다

나는 시도했습니다. 나는 두 x0Ax0A의 조인을 sed로 대체하려고 시도했다. 심지어 \ n \ n을 사용했지만 작동하지 않았다. 정상적인 줄이 필요하기 때문에 모두 \n을 제거 할 수 없습니다. 적어도 두 번 이상 나타나면 제거하고 싶습니다. 다시 말하지만 꼬리 또는 머리를 사용하여 제거 할 수는 있지만 모든 파일이 그런 식으로 도착할 것이라고 가정합니다.

단순한 찾기 및 바꾸기로 보는 것이지만 줄 바꿈으로 작업 할 때는 작동하지 않는 것 같습니다. 정보 목적

: 그것의 텍스트 파일로 인식되지

file -i 2014-09-07-13-46-51.log 
    2014-09-07-13-46-51.log: application/octet-stream; charset=binary 

은 ...이 파일은 플래시 공유 객체 (.sol)에서 추출된다.

새 파일이 이와 같지 않고 정상적인 텍스트 파일로 도착했기 때문에 파일을 쉽게자를 수 없지만 문제가있는 사람들을 치료해야합니다.

+2

BOM이있는 UTF-16처럼 보입니다. 해당 인코딩을 처리 할 수있는 파일로 파일을 열어보십시오. 그런 다음 더 나은 인코딩으로 변환 할 수 있는지 확인하십시오. –

+0

당신이 옳다고 생각합니다. BOM이있는 UTF-16 인 것 같습니다. 먼저 iconv -f UTF-16 -t UTF-8로 변환하면 첫 번째 바이트와 00이 제거되지만 마지막 바이트는 제거됩니다. 바이트가 망가 졌을 수도 있습니다. 파일이 손상되었을 수도 있습니다. 0d 0a00 0d0a – Luciano

+0

"손상"이란 정확히 무엇입니까? 거기에 무작위로 'NUL'문자가있는 것으로 보입니다. 그 문자는 내가 추측 할 수없는 것들을 던질 수 있는지 확실하지 않습니다. 이 파일을 다시 작성하는 것은 올바르게 변환 된 것처럼 보이지만 마지막 줄에는 임의의 'NUL'바이트가 있습니다. –

답변

1

파일 시작 부분의 "fffe"는 바이트 순서 표시 (http://en.wikipedia.org/wiki/Byte_order_mark)이며 유니 코드 형식의 파일임을 나타내는 표시입니다. 이런 종류의 파일에서 '보통'ascii 문자는 2 바이트로 표시됩니다.

또 다른 stackoverflow 질문/aswer 파일을 먼저 UTF-8로 변환됩니다 ...(grepping binary files and UTF16)

+0

바이트 순서 표시에 대한 정보를 보내 주셔서 감사합니다! Etan에게 다른 의견을 말했을 때 나는 iconv를 실행하여 iconv -f UTF-16 -t UTF-8 파일을 읽는 것이 더 쉽습니다. 일부 편집자에서는 끝 바이트가 엉망 : 0d 0a00 0d0a – Luciano

0

그냥 파일 중 ASCII 문자를 원하는 경우에 당신은 당신이 sed, tr 또는 요구을 알고 iconv

당신은 아마 file -i

+0

파일 -i 2014-09-07-13-46-51.log 2014-09-07-13-46-51.log : application/octet-stream; charset = binary 문제는 해당 파일이 플래시 공유 객체 (.솔) 그리고 그 도착은 벌써 타락했다 – Luciano

0

으로 파일의 인코딩을 식별 할 수있는 시도 할 수 있습니다 awk하지만 마음이 바뀔 것입니다. Perl에게 무거운 짐을 덜어주는 것이 얼마나 쉬운 일입니다.

perl -e 'open my $fh, "<:encoding(utf16)", $ARGV[0] or die "Error reading $ARGV[0]: $!"; while (<$fh>) { s{\x0d\x0a}{\n}g; s{\x00\n}{}g; print $_; }' input_filename 
+0

나는 그것을 시험해보고, 당신에게 비난을 준다! 나는 나 자신을 나쁘게 표현했을지도 모른다. 나는 반드시 그 3 개의 명령을 사용할 필요는 없다. 나는 데비안에서 그 일을하는 것을 필요로한다. – Luciano

0

나는 마침내 그것을 만들었지 만 정말로 해결책을 좋아하지 않았습니다. 그때, 파이프 (|)와 같은 다른 문자로 모든 줄 바꿈을 대체 나는 순서 (||)의 두 가지를 발견했을 때 다음 제거하고 \n

sed 's/\xFF\xFE//g; s/\x00//g; s/\x0D//g' 2014.log | tr '\n' '|' | sed 's/||//g;' | sed 's/|/\x0A/g' > 5.log 

다시 (|)를 파이프로 변환 한 - @Luciano