개행 문자를 sed로 바꾸는 방법은 무엇입니까? [복사]

개행 문자를 sed로 바꾸는 방법은 무엇입니까? [복사]

바꿔야 할 공백(줄 바꿈 포함)이 있는 텍스트가 있습니다. 사용하고 싶지만 sedAIX에서 지원하지 않는 것 같습니다.답변내가 발견한 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실패할 때까지 계속그리고변수를 빈 문자열로 설정합니다.

관련 정보