2014-09-12 2 views
1

Windows에서이 문자 (/ r/n)를 제거하는 스크립트를 만들려고합니다. 하지만 그들이이 (") 사이에있는 경우에만 덤프 파일이 문자를두고 있기 때문에 왜? 그 이유. 을 모르고 단지 나에게 영향을주기 때문에 왜 따옴표 사이? 그들은 내 결과를 자르고 경우bash 스크립트로 줄 끝 문자를 제거 하시겠습니까?

For Example. "this","is","a","result","from","database" 

문제 :

"this","is","a","result","from","da 
tabase" 

[편집] 나는이 enter image description here

처럼 뭔가있어 @Cyrus의 대답

감사합니다

하지만 대체 명령에서 'bad'플래그가 표시됩니다. '}'MAC OSX에 있습니다.

도와 주시겠습니까?

감사

+0

* 줄 * 문자의 끝을 의미합니까? 그리고 그것들은 리눅스와 같은 POSIX 시스템에서 단 하나의 "\ n"입니다. –

+0

@JoachimPileborg 네, 문자가 무엇인지는 알고 있습니다 만, 나는 그들을 제거하는 방법을 모르겠습니다 - 컨텍스트 - Oracle에 진행 덤프 파일을 내보낼 때 eol 문자와 충돌합니다. 내 결과를 잘랐다. 내가 왜 그걸 제거하고 싶은지. 수정 해 주셔서 감사합니다 (Y) – jompi

+0

Mac OSX? 태그를 수정하십시오. – Cyrus

답변

2

OS X를 일반적으로 리눅스에 설치되어 아닌 다른 sed를 사용합니다.

큰 차이점은 \r\n과 같은 시퀀스가 ​​예상대로 표현의 일부로 확장되거나 사용되지 않으므로 명령을 세미콜론으로 구분해야하는 경향이 있다는 것입니다.

이 같은 규칙을 구현하는 나오지도 한 줄에 의해 얻을 수 있다면 내 실험에

... 그것은 확실히 당신의 작업을 단순화 할 것 "인용 부호를 포함하는 라인에 어떤 \r\n 제거", 내가 무엇을 사용 나는 추론 샘플 입력 데이터는 다음과 같습니다

$ od -c input.txt 
0000000 F o r  E x a m p l e .  " t h 
0000020 i s " , " i s " , " a " , " r e 
0000040 s u l t " , " f r o m " , " d a 
0000060 t a \r \n b a s e " \n       
0000072 

먼저 떨어져, 쉘 전용 솔루션은 운영 체제에 내장 작은 도구를 사용하여 수 있습니다. 여기,

od -A n -t o1 -v input.txt | rs 0 1 | while read n; do [ $n -eq 015 ] && read n && continue; printf "\\$n"; done 

가 쉽게 읽을 세분화이 보이는 무엇과 같은 : 예를 들어, 여기에 한 줄의

  • od -A n -t o1 -v input.txt | rs 0 1 - OCAL 번호
  • | while read n; do의 스트림으로 파일을 변환 - 숫자를 단계별로 ...
    • [ $n -eq 015 ] && - 현재 숫자가 15 일 경우 (즉, 캐리지 리턴의 경우 8 진수)
    • read n - 라인 (따라서 건너 뛰기),
    • && continue 읽기 - 그리고
    • printf "\\$n"; done (따라서 CR 후 줄 바꿈을 건너 뛰는) 다음의 8 진수로 진행 - 현재 8 진수를 인쇄 할 수 있습니다.

데이터 변환 및 스트림 로직 이러한 종류의 파이프 라인에서 잘 작동,하지만 원래의 입력보다는 변환 된 형태로 처리하는 방법을 알고있는 SED에서 구현하기가 조금 어렵습니다.

또 다른 배쉬 옵션은 입력의 원래 라인을 일치 조건식을 사용하는 수 있습니다 :

while read line; do 
    if [[ $line =~ .*\".*$'\r'$ ]]; then 
    echo -n "${line:0:$((${#line}-1))}" 
    else 
    echo "$line" 
    fi 
done < input.txt 

이 텍스트를 산책하고,이 CR을 보는 경우를 포함하여이 아닌까지, 그와 함께, 모든 인쇄 꼬리말. 다른 모든 줄의 경우 평소와 같이 인쇄합니다. 결과는 캐리지 리턴이있는 행이 조인되고 다른 행은 조인되지 않습니다.

sed의 관점에서 우리는 두 개의 입력 라인을 다루고 있습니다. 첫 번째 입력 라인은 캐리지 리턴으로 끝납니다. 이를위한 전략은 캐리지 리턴을 검색하여 제거하고 라인을 결합하는 것입니다. 나는 잠시 동안이 일을 할 수있는 것을 찾아 내려고 애썼다가 포기했다. 불가능하다고는 말할 수 없지만, 일반적으로 유용한 스크립트는 (sed 표준에 따라) 길어질 것입니다.

+0

놀라운! 그리고 아주 잘 설명했습니다! 나는 이것에서 많은 것을 배웠고, 매우 ghoti 고마워요. – jompi

+0

캐리지 리턴을 어떻게 지우시겠습니까? 내 말은 내가 말했듯이 >> newtext.txt처럼 넣었고 매력적 이었지만 실제 파일은 약 10Gb 였고'>> newtext.txt'를 실행하면 끔찍한 일이 될 것이고 처음 1 개의 라이너가 생겼을 것입니다. 예를 들어 그것을 인쇄했다면 파일에서 CR을 제거 할 수 있습니까? – jompi

+0

@ jompi, 첫 번째 옵션에서 데이터는 파이프를 통해 이동합니다. 두 번째 단계에서는 입력 리디렉션을 사용하고 있습니다. 따라서 어떤 방법도 10GB (또는 임의의 크기) 파일에 문제가 없어야합니다. 파이프와 리디렉션은 처리하기 위해 "파일을 메모리에로드"할 필요가 없다는 점에서 훌륭합니다. * 스트림 * (또는 그 작은 버퍼) 만 처리합니다. – ghoti

관련 문제