コマンドを実行するcat file | grep pattern
と、多くの出力行が表示されます。すべての行を1つの行に連結し、それぞれ"\n"
を効果的に"\" "
(最後に"
スペースが続く)に置き換えるにはどうすればよいですか?
cat file | grep pattern | xargs sed s/\n/ /g
私のために働いていません。
tr '\n' ' '
すべての改行文字をスペースに変換するために使用します。
$ grep pattern file | tr '\n' ' '
注:grep
ファイルを読み取り、ファイルをcat
連結します。しないでくださいcat file | grep
!
編集:
tr
1文字の翻訳のみを処理できます。awk
次のように、出力レコード区切り文字を変更できます。
$ grep pattern file | awk '{print}' ORS='" '
これは変換されます:
one
two
three
に:
one" two" three"
引用符なしのbashecho
では、キャリッジリターン、タブ、および複数のスペースを削除します
echo $(cat file)
これはあなたが望むものかもしれません
cat file | grep pattern | paste -sd' '
あなたの編集に関しては、それが何を意味するのかわかりません、おそらくこれですか?
cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'
~
(これはで発生しないことを前提としていますfile
)
これは、コンマで区切って出力を生成する例です。カンマは、必要な区切り文字に置き換えることができます。
cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD
生成:
1,2,3,4,5
改行文字 \n
をスペースに置き換えたい場合:
xargs < file
xargs
1行あたりの文字数とすべての文字を組み合わせるには独自の制限がありますが、増やすこともできます。詳細は次のコマンドを実行することで見つけることができます:xargs --show-limits
そしてもちろんマニュアルで:man xargs
ある文字を別の文字に正確に置き換えたい場合:
tr '\n' ' ' < file
1つの文字を多くの文字に置き換えたい場合:
tr '\n' '~' < file | sed s/~/many_characters/g
まず、\n
チルダの改行文字を置き換えます~
(または、テキストに存在しない別の一意の文字を選択します)。次に、チルダ文字を他の文字(many_characters
)に置き換え、チルダごとに行います(フラグg
)。
私はxargs
解決策が好きですが、スペースを折りたたまないことが重要な場合は、代わりに次のようにすることができます。
sed ':b;N;$!bb;s/\n/ /g'
これにより、スペースの改行が置き換えられ、最後の行のターミネータがそのように置き換えられることはありtr '\n' ' '
ません。
これにより、スペース以外に、コンマなど、xargs
実行できない他の結合文字列を使用することもできます。
$ seq 1 5 | sed ':b;N;$!bb;s/\n/,/g'
1,2,3,4,5
以下を使用した別の簡単な方法を次に示します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行に出力を生成する「awk」ツールを使用することです
$ awk ' /pattern/ {print}' ORS=' ' /path/to/file
すべての行をスペース区切り文字で1つにマージします
Red Hat Linuxでは、echoを使用します:
echo $(cat / some / file / name)
これにより、ファイルのすべてのレコードが1行で表示されます。