web-dev-qa-db-ja.com

どうすれば1行にパターンを「マージ」できますか?

私はgrepとsedを実行していて、興味のあるファイルの2行を取得しています。これらの行を、改行文字で終わる単一行に取得するにはどうすればよいですか?
今私は得ています:

pattern1  
pattern2  

pattern1 pattern2 \n

10
Jim

paste

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

つまり、「標準入力から行を読み取ります(最初の-)、stdinから別の行を読み取ります(2番目の-)、スペースで結合します」


bash固有のテクニック:

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

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

7
glenn jackman

3つのバージョンの異なるメソッドを続けて配置します

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

そして、もっとたくさんあります。

6

シェルスクリプトを使用するか、コマンドラインで実行できます。コマンドの出力を変数に入れてから、echoを実行します。

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

sedを使用すると、次のことができます。

<your previous commands> | sed '{N; s/\n/ /}'
  • N;は、次の行をパターンスペースに追加するようsedに指示するため、sedは両方の行で機能します。
  • s/\n/ /は、改行文字をスペースで置き換え、2行を「マージ」します。
2
Alaa Ali

簡単な方法は、出力をxargsにパイプすることです。

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

コマンドラインあたりの最大文字数によって制限されるため、これは小さな出力でのみ機能します。最大値はシステムによって異なります。getconf ARG_MAXを使用してこの値を取得できます。

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

必要に応じてIFSが喜んで食べます。

1
mikeserv