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 표준에 따라) 길어질 것입니다.
* 줄 * 문자의 끝을 의미합니까? 그리고 그것들은 리눅스와 같은 POSIX 시스템에서 단 하나의 "\ n"입니다. –
@JoachimPileborg 네, 문자가 무엇인지는 알고 있습니다 만, 나는 그들을 제거하는 방법을 모르겠습니다 - 컨텍스트 - Oracle에 진행 덤프 파일을 내보낼 때 eol 문자와 충돌합니다. 내 결과를 잘랐다. 내가 왜 그걸 제거하고 싶은지. 수정 해 주셔서 감사합니다 (Y) – jompi
Mac OSX? 태그를 수정하십시오. – Cyrus