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


10

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

pattern1  
pattern2  

もらいたい pattern1 pattern2 \n


1
より多くのサンプルデータを共有できますか?
slm

使用 printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami 2014

複数行の出力を1つにマージする場合は、貼り付けがジョブのツールです。
slm

特定のツール?これをどのように行う予定ですか?
Braiam 2014

回答:


7

paste

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

つまり、「stdin(最初の-)から行を読み取り、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


なに- -?コマンドはそのようなものですか?
ジム

@ジム-はい、それは正しいです。これらはpaste、入力を処理する方法を示しています。一度に2つ。一度に3を行うには、さらに追加します。seq 10 | paste -d " " - -
slm

6

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

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


trあなたが追加したい場合がありますので、解決策は、終了の改行を飲み込むだろう; echo1つに
グレンはジャックマン

@glennjackmanああ!ヒントをありがとう。ただし、答えは自由に変更できます。ちょっと逃した!
Valentin Bajrami 2014

2

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

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

引用符で囲まれていない場合、変数もファイル名の展開の対象となるため、結果にグロブ文字(*またはなど?)がある場合、値が変わる可能性があります。
グレン・ジャックマン、2014

@glennjackman、これについて言及してくれてありがとう、どうすれば修正できますか?
Nidal 2014

@Networkerはバックティックを使用せず、$()代わりにprintfを使用printf '%s\n' "$x"
Valentin Bajrami

printf '%s\n' "$x"「内部」改行が削除されないことを期待します。
グレン・ジャックマン、2014

2

ではsed、これを行うことができます:

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

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コマンドの出力が実行されます。
グレンジャックマン2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.