私はgrepとsedを実行していて、興味のあるファイルの2行を取得しています。これらの行を、改行文字で終わる単一行に取得するにはどうすればよいですか?
今私は得ています:
pattern1
pattern2
pattern1 pattern2 \n
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
3つのバージョンの異なるメソッドを続けて配置します
printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'
printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo
そして、もっとたくさんあります。
シェルスクリプトを使用するか、コマンドラインで実行できます。コマンドの出力を変数に入れてから、echo
を実行します。
# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2
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
を使用してこの値を取得できます。
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output
必要に応じてIFSが喜んで食べます。