바꿔야 할 공백(줄 바꿈 포함)이 있는 텍스트가 있습니다. 사용하고 싶지만 sed
AIX에서 지원하지 않는 것 같습니다.답변내가 발견한 sed
줄바꿈 문제 . 내가 사용하는 bash 버전은 "GNU bash, version 3.00.16(1)-release (powerpc-ibm-aix5.1)"입니다.
예를 들어, 여러 줄의 텍스트를 출력하는 명령을 실행하면 다음과 같습니다.
alias: aliasname
10:00:00:00:00:00:00:00
한 줄에 한 줄씩 만드는 가장 좋은 방법은 무엇입니까? 를 사용하면 ssh user@system command | tr '\n' ' '
두 개의 개행 문자가 대체되고 마지막 개행 문자는 유지해야 합니다. 그렇지 않으면 출력이 한 줄이 됩니다.
편집: 지금까지 내가 시도한 것은 다음과 같습니다.
| sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g'
모든 줄 바꿈을 대체하여 전체 출력 스트림을 한 줄에 넣습니다.| while read i; do printf "%s " $i; done; echo
이것은 또한 모든 개행 문자를 대체합니다.| tr -d '\n'
및| tr -d '\n'; echo
, 여전히 모든 줄 바꿈을 대체하지만 마지막 명령에 에코를 추가합니다.
답변1
제일 쉬운
ssh user@system command | tr '\n' ' ';echo
아니면 당신이 원한다면sed
ssh user@system command | sed 'N;s/\n\s\+/ /'
답변2
다음은 각 쌍의 첫 번째 개행 문자를 제거하는 순수한 bash 방법입니다.
command |
while IFS=$'\n' read i; do
let c++; [ "$(expr $c % 2)" -eq "0" ] && echo "$i" || printf "%s " "$i";
done
공백을 그대로 유지할 필요가 없다면 공백을 생략할 수 있습니다 IFS
.
command |
while read i; do
let c++; [ "$(expr $c % 2)" -eq "0" ] && echo "$i" || printf "%s " "$i";
done
동일한 아이디어는 다음을 사용합니다 perl
.
command | perl -ne 'chomp;$. % 2 == 0 ? print "$_\n" : print "$_"'
답변3
이 시도:
sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g'
답변4
이를 수행하려면 ; 을 사용하는 것이 가장 좋습니다 sed
. 바라보다쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까? 예를 들어, 이 작은 변화는코스타스의 두 번째 sed
답변 ( ):
sed 'N; s/\n/ /'
질문에 대한 좋은 대답:
N
다음 입력 줄을 패턴 공간에 추가한 다음 s/\n/ /
교체를 수행합니다. (그런 다음 두 줄의 입력마다 이 명령을 반복하십시오.)
그러나 이 작업을 셸에서 완전히 수행하려면 이 변형을 사용하세요.테든의 답변:
while IFS= read -r line1
do
IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done
작동하기 위해 외부 프로그램을 실행할 필요가 없습니다. 논리는 (IMHO) 간단합니다. 입력이 끝나지는 않지만 한 줄을 읽은 다음 다른 줄을 읽은 다음 공백으로 구분된 두 문자열을 한 줄에 출력합니다.
위의 코드에는 극단적인 경우 문제가 있습니다. 입력이 짝수 개의 올바른 형식의 줄과 개행으로 끝나지 않는 일부 문자가 뒤따르는 경우 줄의 마지막(일부)을 삭제합니다. (테든의 답변같은 문제가 있었지만 행뿐만이 아닙니다. ) 이는 read
데이터를 변수에 넣더라도 행의 일부를 읽으면 실패를 반환하기 때문입니다 . 그래서 수정 사항은 다음과 같습니다.
while IFS= read -r line1 || [ "$line1" != "" ]
do
IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done
read
실패할 때까지 계속그리고변수를 빈 문자열로 설정합니다.