한 줄에 패턴을 어떻게 "병합"할 수 있습니까?


10

grep과 sed를하고 있고 관심있는 파일의 2 줄을 얻습니다.이 줄을 한 줄에 새 줄 문자로 끝나는 방법은 무엇입니까?
지금 나는 얻고있다 :

pattern1  
pattern2  

나는 받고 싶다 pattern1 pattern2 \n


1
더 많은 샘플 데이터를 공유 할 수 있습니까?
slm

사용 printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami

붙여 넣기는 여러 줄의 출력을 하나로 병합하려는 경우 작업을위한 도구입니다.
slm

특정 도구가 있습니까? 어떻게 할 계획입니까?
Braiam

답변:


7

paste:

{...pipeline...} | paste -d " " - -

"stdin (첫 번째 -) 에서 한 줄을 읽고 stdin (두 번째 )에서 다른 한 줄을 읽은 -다음 공백으로 연결하십시오"라고 말합니다.


배쉬 특정 기술 :

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

심판 : http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile


무엇입니까 - -? 그런 명령입니까?
Jim

@Jim-네 맞습니다. 그들은 paste입력을 처리하는 방법을 알려 줍니다. 한 번에 2 개. 한 번에 3 개를 더 추가하십시오. seq 10 | paste -d " " - - .
slm

6

나는 세 가지 버전의 다른 방법을 연속으로 넣을 것이다.

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

그리고 더 많은 것이 있습니다.


tr솔루션은 결말 개행을 삼킬 것이므로 그 줄에 추가하고 싶을 ; echo것입니다.
glenn jackman

@glennjackman 아 맞아! 힌트 주셔서 감사합니다. 그래도 답변을 자유롭게 수정할 수 있습니다. 나는 그 비트를 놓쳤다!
Valentin Bajrami

2

쉘 스크립트를 사용하거나 명령 행에서이를 수행 할 수 있습니다. 명령의 출력을 변수에 넣고 다음을 수행 echo하십시오.

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

인용되지 않은 변수는 파일 이름 확장에도 영향을 미치 므로 결과에 glob 문자 (예 : *또는 ?) 가 있으면 값이 변경 될 수 있습니다.
glenn jackman

@glennjackman, 이것을 언급 해 주셔서 감사합니다. 어떻게 해결할 수 있습니까?
Nidal

@Networker는 백틱을 사용하지 $()않고 대신 .. 및 printf를 사용하여printf '%s\n' "$x"
Valentin Bajrami

나는 그것이 printf '%s\n' "$x""내부"줄 바꿈을 제거하지 않을 것으로 기대합니다 .
glenn jackman

2

을 사용 sed하면 다음을 수행 할 수 있습니다.

<your previous commands> | sed '{N; s/\n/ /}'
  • N;sed다음 줄을 패턴 공간에 추가하도록 지시 하므로 이제 sed두 줄을 모두 사용하고 있습니다.
  • s/\n/ / 줄 바꾸기 문자를 공백으로 바꾸고 두 줄을 "병합"합니다.

2

간단한 방법으로 파이프 출력 xargs:

$ echo -e 'a\nb' | xargs
a b

명령 줄당 최대 문자 수로 제한되므로 작은 출력에서만 작동합니다. 가장 큰 값은 시스템에 따라 다르며을 사용하여이 값을 얻을 수 있습니다 getconf ARG_MAX.


1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

원한다면 IFS가 기꺼이 먹을 것입니다.


-1

sed / grep을 백틱으로 감싸십시오.

원래 명령이 :

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

새로운 명령은 다음과 같습니다.

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

줄 사이에 공백이 없지만 항상 다른 sed 파이프를 고정시킬 수 있습니다.

 | sed 's/$/ /'

1
아뇨 sed 명령의 출력 이 실행 됩니다 .
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.