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
. 하지만 아무것도 아니야. 여기에 매우 중요하고 기본적인 것이 빠진 것 같습니다.
답변1
sed
줄 바꿈 구분 기호 \n
- 항상 입력 시 제거되고 출력 시 다시 삽입됩니다. 가지다안 돼요\n
sed
편집 결과로 나타나지 않는 패턴 공간의 새 줄 문자 .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