파일에서 알 수없는 문자와 빈 줄을 제거해야합니다. 간단해야하며 실제로 할 수 없다는 것이 정말 어리 석습니다. 아직. 어떤 이유로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 개를 제거하고 CRLF
을 LF
으로 변환하고 싶습니다.
내가 할 수있는 머리, 꼬리와 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
)에서 추출된다.
새 파일이 이와 같지 않고 정상적인 텍스트 파일로 도착했기 때문에 파일을 쉽게자를 수 없지만 문제가있는 사람들을 치료해야합니다.
BOM이있는 UTF-16처럼 보입니다. 해당 인코딩을 처리 할 수있는 파일로 파일을 열어보십시오. 그런 다음 더 나은 인코딩으로 변환 할 수 있는지 확인하십시오. –
당신이 옳다고 생각합니다. BOM이있는 UTF-16 인 것 같습니다. 먼저 iconv -f UTF-16 -t UTF-8로 변환하면 첫 번째 바이트와 00이 제거되지만 마지막 바이트는 제거됩니다. 바이트가 망가 졌을 수도 있습니다. 파일이 손상되었을 수도 있습니다. 0d 0a00 0d0a – Luciano
"손상"이란 정확히 무엇입니까? 거기에 무작위로 'NUL'문자가있는 것으로 보입니다. 그 문자는 내가 추측 할 수없는 것들을 던질 수 있는지 확실하지 않습니다. 이 파일을 다시 작성하는 것은 올바르게 변환 된 것처럼 보이지만 마지막 줄에는 임의의 'NUL'바이트가 있습니다. –