sed가 개행 문자를 제거하지 못함


12

나는 sed꽤 오랫동안 사용 해왔 지만 여기에 내가 가지고있는 기발한 것이 있는데, 나는 해결할 수 없다.

실제 사례에 대한 문제를 설명하겠습니다.


장면 # 1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

첫 번째 명령에서는 printf출력을 파이프 xclip하여 클립 보드에 복사합니다. 이제 printf, 달리는 echo기본적으로 마지막에 새 줄을 삽입하지 않습니다. 따라서이 내용을 터미널에 붙여 넣으면 ls복사 된 명령이 자동으로 실행되지 않습니다.

두 번째에는 끝에 새 줄이 있으므로 클립 보드 내용을 붙여 넣으면 클립 보드에서 명령이 실행됩니다.

이것은 나에게 바람직하지 않습니다. 따라서을 사용하여 줄 바꿈을 제거하고 싶었지만 sed아래 장면에서 설명한대로 실패했습니다.

장면 # 2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

클립 보드의 내용에는 여전히 줄 바꿈이 포함되어 있습니다. 터미널에 붙여 넣으면 명령이 자동으로 실행됩니다.

나는 또한 캐리지 리턴 문자를 제거하려고 시도했다 \r. 그러나 나다. 여기에 매우 중요하고 기본적인 것이 빠져있는 것 같습니다.

답변:


16

sed\newlines를 구분합니다 -항상 입력에서 제거되고 출력에 다시 삽입됩니다. 없다 결코\n A의 ewline 문자 sed당신이 만든 편집의 결과로 발생하지 않은 패턴 공간. 참고 : GNU는 예외 sed-z모드 ...

그냥 사용하십시오 tr:

echo ls | tr -d \\n | xclip -selection clipboard

또는 더 나은 방법은 sed다음과 같습니다.

printf ls | xclip -selection clipboard

이것은 모든 줄 바꿈 을 제거 하며 종종 경우에 바람직하지 않습니다 generate-text | xclip. 이 답변 은 마지막 줄 바꿈 만 제거합니다.
Tom Hale

7

sed를 포함한 많은 텍스트 처리 도구는 줄 바꿈 문자를 제외하고 줄 내용에서 작동합니다. sed는 줄을 처리 할 때 마지막에 줄 바꿈을 제거한 다음 스크립트에서 명령을 실행하고 인쇄 할 때 마지막 줄 바꿈을 추가합니다. 따라서 sed를 사용하여 줄 바꿈을 제거 할 수 없습니다.

모든 줄 바꿈을 제거하려면 tr대신 사용할 수 있습니다 .

echo "ls" | tr -d '\n' | xclip


4

sed에서 -z 옵션 을 전달하여 줄 바꿈을 바꿀 수 있습니다 .

sed -z 's/\n/ /g'

sed 맨 페이지 :

-z, --null-data 는 NUL 문자로 행을 구분합니다.


이렇게하면 모든 줄 바꿈 이 제거 되며 일반적으로이 | xclip경우에는 바람직하지 않습니다 .
Tom Hale

2

클립 보드에 명령을 넣는 경우

echo -n "ls " | xclip -selection clipboard

더 복잡한 변환을 추가로 수행해야하는 경우

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

흠. 부드러운 솔루션. 아마도 정규 표현식을 위해 펄이나 파이썬으로 넘어갈 때가되었을 것입니다.
shivams

3
@shivams - perl그리고 python모두 훨씬 낮은 속도 보다 sed올바르게 사용하는 경우가 될 수 있습니다. 그러나 올바르게 사용하는 법을 배우는 것이 열쇠입니다.
mikeserv

@mikeserv-동의합니다. oneliner sed를위한 스페셜은 훌륭합니다. 변환이 더 복잡해지면 perl / python / gawk를 선호합니다.
JJoao

1
@JJoa : 당신의 선호는 당신 자신의 것이지만, sed단지 하나의 라이너를 다루는 것보다 훨씬 더 많은 일을 할 수 있으며, 당신이 언급 한 다른 도구보다 훨씬 빠를 수 있습니다.
mikeserv

1
@ mikeserv-다시 한 번 동의합니다. 몇 년 전에 나는 sed에 의해 생성 된 번역 시스템 EN-PT를 sed (20000 s /.../.../)로 작성했습니다! 그리고 효과가있었습니다! 나중에 배열, 해시, 함수, 패키지 및 CPAN을 갖기 위해 Perl이되었습니다.
JJoao

1

마지막 개행 만 제거하려면 다음을 통해 파이프하십시오.

sed -z '$ s/\n$//'

sed\0구분 기호가 NULvia 로 설정된 경우 스트림 끝에 a 를 추가하지 않고 -zPOSIX 텍스트 파일 (a로 끝나도록 정의 됨)을 만들려면 \n항상을 사용 \n하지 않고 final 을 출력합니다 -z.

예 :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

그리고 NUL추가 되지 않음을 증명하기 위해 :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

여러 줄 바꿈 개행제거 하려면 다음을 통해 파이프하십시오.

sed -Ez '$ s/\n+$//'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.