sed는 개행 문자를 제거할 수 없습니다

sed는 개행 문자를 제거할 수 없습니다

sed오랫동안 사용해 왔는데 , 해결할 수 없는 이상한 점을 만났습니다.

실제 사례를 통해 내 문제를 설명하겠습니다.


장면 1

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

첫 번째 명령에서는 printf출력을 파이프하여 xclip클립보드에 복사합니다. 이제 기본적으로 printfecho줄이 끝에 삽입되지 않습니다. 그래서 이것을 터미널에 붙여넣으면 ls복사된 명령이 자동으로 실행되지 않습니다.

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

이것은 나에게 바람직하지 않습니다. 그래서 를 사용하여 개행 문자를 제거하고 싶었지만 sed아래 시나리오에 설명된 대로 실패했습니다.

시나리오 #2

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

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

나는 또한 캐리지 리턴을 제거해 보았습니다 \r. 하지만 아무것도 아니야. 여기에 매우 중요하고 기본적인 것이 빠진 것 같습니다.

답변1

sed줄 바꿈 구분 기호 \n- 항상 입력 시 제거되고 출력 시 다시 삽입됩니다. 가지다안 돼요\nsed편집 결과로 나타나지 않는 패턴 공간의 새 줄 문자 .sed참고: GNU 모드는 제외 -z...

그냥 사용하십시오 tr:

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

아니면 sed완전히 잊어버리는 것이 더 좋습니다.

printf ls | xclip -selection clipboard

답변2

sed를 전달하여 개행 문자를 바꿀 수 있습니다-지옵션.

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

Sed 매뉴얼 페이지:

-z, --빈 데이터NUL 문자로 줄을 구분하세요.

답변3

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

모든 개행 문자를 제거하려면 다음을 사용할 수 있습니다 tr.

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

답변4

명령을 클립보드에 넣으면

echo -n "ls " | xclip -selection clipboard

더 복잡한 변환도 수행해야 하는 경우,

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

관련 정보