여러 줄의 출력을 한 줄로 연결하는 방법은 무엇입니까?


158

명령을 실행하면 cat file | grep pattern여러 줄의 출력이 표시됩니다. 어떻게 효과적으로 각을 대체 한 줄에 모든 라인을 연결 않습니다 "\n""\" "(최종 "공백)?

cat file | grep pattern | xargs sed s/\n/ /g 나를 위해 작동하지 않습니다.


그런데 : (1) 당신은 당신의 둘 필요가 sed배쉬는 (이후에 관여하지 않도록하는 단일 따옴표로 스크립트를 sed s/\n/ /g호출 sed두 개의 인수, 즉와 s/n//g); (2)의 출력을 원하기 때문에 cat file | grep pattern할 수 입력sed아닌 인수sed는 제거 할 필요가 xargs; (3) 파일 이름을 두 번째 인수로 사용할 수 cat있으므로 여기에 필요하지 않습니다 grep. 따라서 시도해야합니다 grep pattern file | sed 's/\n/ /g'. (이 경우 위의 링크에서 주어진 이유로 인해 작동하지 않았지만 이제는 미래를 알고 있습니다.)
ruakh


68 표 (140k 뷰)의 질문이 1 개의 투표 (12k 뷰) 만있는 게시물로 복제 되었습니까? 이것은 옳지 않습니다.
kenorb

답변:


231

tr '\n' ' '모든 개행 문자를 공백으로 변환하는 데 사용하십시오 .

$ grep pattern file | tr '\n' ' '

참고 : grep파일을 읽고cat 연결합니다. 하지마 cat file | grep!

편집하다:

tr단일 문자 번역 만 처리 할 수 ​​있습니다. 다음 awk과 같이 출력 레코드 구분 기호를 변경하는 데 사용할 수 있습니다 .

$ grep pattern file | awk '{print}' ORS='" '

이것은 다음과 같이 변형됩니다.

one
two 
three

에:

one" two" three" 

3
이 접근 방식으로 결국 원하지 않는 공간이 생깁니다.
sorin

1
당신은 추가 할 필요가 echo ""프롬프트 텍스트하기 전에 새로운 라인을 추가하는 말.
nexayq

1
이것은 잘 작동하지만 마지막 항목에 구분 기호가 표시되는 것을 원하지 않습니다. 예를 들어,에 "표시 one" two" three"되지만과 같이 표시되기를 원합니다 one" two" three. 마지막 세 개에는 괄호가 없습니다. 어떤 아이디어?
OINK

2
@ oink 당신은 sed '$s/..$//'마지막 줄에서 마지막 두 문자를 삭제하기 위해 결과를 파이프 수 있습니다.
Chris Seymour

3
줄 바꿈을 아무것도 바꾸지 않으려면 --delete기본값에 두 개의 인수 가 필요하므로 옵션 을 사용해야합니다 . 예 tr --delete '\n'.
Elijah Lynn

69

파이핑 출력 xargs은 각 출력 라인을 공백이있는 단일 라인으로 연결합니다.

grep pattern file | xargs

또는 모든 명령 (예 : ls | xargs. xargs출력 의 기본 제한 은 ~ 4096 자이지만 예를 들어 늘릴 수 있습니다. xargs -s 8192.


| tr '\n' ' 'php exec함수를 통해 호출 할 때 나를 위해 작동하지 않았습니다 . tr을 무시하고 grep에서 마지막으로 일치시킵니다. | xargs일했다.
Adarsha

3
이 솔루션은 또한 입력에서 공백을 '먹는'장점이 있습니다. +1
르네

55

echo따옴표없이 bash에서 캐리지 리턴, 탭 및 여러 공백을 제거하십시오.

echo $(cat file)

8
여기에 심각하게 과소 평가 된 답변은 매우 간단하며 줄 바꿈 문자가있는 매력처럼 작동합니다.
Dangercrow

이것은 특히 깔끔합니다IFS="$(printf '\n\t')"
aggsol

5
또는 그냥 echo $(<file)에코를 사용하는 것이을 사용하는 것보다 더 깔끔 할 tr '\n' ' '뿐만 아니라 \r\n줄 끝을 생각하는 것이 좋습니다 . @aggsol 당신은 그냥 말할 수 있습니다IFS=$'\n\t'
Normadize

공간이 없으면 어떻습니까?
DimiDak

22

이것은 당신이 원하는 것일 수 있습니다

cat file | grep pattern | paste -sd' '

편집 내용에 대해 이것이 무엇을 의미하는지 잘 모르겠습니다.

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

( ~에서 발생하지 않는 것으로 가정 file)


2
@Stephan cat file은 실제로 cat또는 파일 이라고 가정 할 필요가 없었습니다 . (나는 질문과 관련이
없기

5

쉼표로 구분하여 출력을 생성하는 예입니다. 필요한 구분 기호로 쉼표를 바꿀 수 있습니다.

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

생산 :

1,2,3,4,5

3

다음은 ex편집기를 사용하는 방법 입니다 ( Vim의 일부 ).

  • J 모든 라인 OIN P의 표준 출력 RINT :

    $ ex +%j +%p -scq! file
  • J (파일의) 모든 라인에서 적절한 OIN :

    $ ex +%j -scwq file

    참고 : 파일 자체의 모든 줄을 연결합니다!


2

이 문제를 해결하는 가장 빠르고 쉬운 방법은 다음과 같습니다.

줄 바꾸기 문자 \n 를 공백 으로 바꾸 려면 :

xargs < file

xargs행당 문자 수와 모든 문자 수를 제한하는 자체 제한이 있지만이를 늘릴 수 있습니다. 이 명령을 실행하면 자세한 내용을 확인할 수 있습니다 xargs --show-limits.man xargs

한 문자를 다른 문자바꾸고 싶을 때 :

tr '\n' ' ' < file

한 문자를 여러 문자바꾸고 싶을 때 :

tr '\n' '~' < file | sed s/~/many_characters/g

먼저 \n물결표 의 줄 바꿈 문자 를 바꾸 ~거나 텍스트에없는 다른 고유 한 문자를 선택한 다음 물결표 문자를 다른 문자 ( many_characters)로 바꾸고 각 물결표 (flag g) 에 대해 문자를 바꿉니다 .


0

아마도 가장 좋은 방법은 출력을 한 줄로 생성하는 'awk'도구를 사용하는 것입니다.

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

공백 구분 기호가있는 모든 줄을 하나로 병합합니다.


{print}기본 동작 인 awk 이후 에는 필요하지 않습니다 .
스탁

0

다음을 사용하는 또 다른 간단한 방법이 있습니다 awk.

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

또한 파일에 열이 있으면 특정 열만 쉽게 연결할 수 있습니다.

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

-1

빨간 모자 리눅스에서는 echo :

에코 $ (고양이 / some / file / name)

이것은 한 줄에 파일의 모든 레코드를 제공합니다.


2
이것은 이미 2015 년에 답변 된 것입니다. 당신은 이 답변을 복제 하고 있습니다. 특별히 질문이 7 살이고 이미 8 개의 답변이있는 경우 직접 게시하기 전에 답변을 읽으십시오.
Mickael B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.