217

コマンドを実行するcat file | grep patternと、多くの出力行が表示されます。すべての行を1つの行に連結し、それぞれ"\n"を効果的に"\" "(最後に"スペースが続く)に置き換えるにはどうすればよいですか?

cat file | grep pattern | xargs sed s/\n/ /g 私のために働いていません。

4

11 に答える 11

322

tr '\n' ' 'すべての改行文字をスペースに変換するために使用します。

$ grep pattern file | tr '\n' ' '

注:grepファイルを読み取り、ファイルをcat連結します。しないでくださいcat file | grep

編集:

tr1文字の翻訳のみを処理できます。awk次のように、出力レコード区切り文字を変更できます。

$ grep pattern file | awk '{print}' ORS='" '

これは変換されます:

one
two 
three

に:

one" two" three" 
于 2013-03-22T21:31:18.233 に答える
98

出力をにパイプするxargsと、出力の各行がスペースを含む1行に連結されます。

grep pattern file | xargs

または任意のコマンド、例えば。ls | xargs。デフォルトの出力制限はxargs最大4096文字ですが、たとえば次のように増やすことができます。xargs -s 8192

于 2014-08-11T20:35:10.970 に答える
90

引用符なしのbashechoでは、キャリッジリターン、タブ、および複数のスペースを削除します

echo $(cat file)
于 2015-11-05T09:11:12.343 に答える
24

これはあなたが望むものかもしれません

cat file | grep pattern | paste -sd' '

あなたの編集に関しては、それが何を意味するのかわかりません、おそらくこれですか?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

~(これはで発生しないことを前提としていますfile

于 2013-03-22T21:41:31.477 に答える
11

これは、コンマで区切って出力を生成する例です。カンマは、必要な区切り文字に置き換えることができます。

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

生成:

1,2,3,4,5
于 2018-08-02T12:26:20.123 に答える
7

この問題を解決するために私が知っている最も速くて簡単な方法:

改行文字 \n をスペースに置き換えたい場合:

xargs < file

xargs1行あたりの文字数とすべての文字を組み合わせるには独自の制限がありますが、増やすこともできます。詳細は次のコマンドを実行することで見つけることができます:xargs --show-limitsそしてもちろんマニュアルで:man xargs

ある文字を別の文字に正確に置き換えたい場合:

tr '\n' ' ' < file

1つの文字を多くの文字に置き換えたい場合:

tr '\n' '~' < file | sed s/~/many_characters/g

まず、\nチルダの改行文字を置き換えます~(または、テキストに存在しない別の一意の文字を選択します)。次に、チルダ文字を他の文字(many_characters)に置き換え、チルダごとに行います(フラグg)。

于 2020-02-06T18:55:32.877 に答える
5

私は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
于 2020-08-03T13:23:42.530 に答える
4

exエディターVimの一部)を使用する方法は次のとおりです。

  • すべての行を結合し、標準出力に印刷します。

    $ ex +%j +%p -scq! file
    
  • すべての行をインプレースで結合します(ファイル内)

    $ ex +%j -scwq file
    

    注:これにより、ファイル自体の内部のすべての行が連結されます。

于 2016-12-20T22:19:26.240 に答える
3

以下を使用した別の簡単な方法を次に示します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
于 2020-07-23T15:15:08.863 に答える
0

おそらくそれを行うための最良の方法は、1行に出力を生成する「awk」ツールを使用することです

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

すべての行をスペース区切り文字で1つにマージします

于 2018-03-12T11:22:37.653 に答える
-1

Red Hat Linuxでは、echoを使用します:

echo $(cat / some / file / name)

これにより、ファイルのすべてのレコードが1行で表示されます。

于 2020-05-08T12:30:35.773 に答える