簡體   English   中英

如何將多行輸出連接到一行?

[英]How to concatenate multiple lines of output to one line?

如果我運行命令cat file | grep pattern cat file | grep pattern ,我得到多行輸出。 如何將所有行連接成一行,有效地將每個"\\n"替換為"\\" " (以"后跟空格結尾)?

cat file | grep pattern | xargs sed s/\\n/ /g cat file | grep pattern | xargs sed s/\\n/ /g對我不起作用。

使用tr '\\n' ' '將所有換行符轉換為空格:

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

注意: grep讀取文件, cat連接文件。 不要cat file | grep cat file | grep

編輯:

tr只能處理單個字符的翻譯。 您可以使用awk更改輸出記錄分隔符,例如:

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

這將轉變:

one
two 
three

到:

one" two" three" 

管道輸出到xargs會將每一行輸出連接到一行帶有空格的行:

grep pattern file | xargs

或任何命令,例如。 ls | xargs ls | xargs xargs輸出的默認限制是 ~4096 個字符,但可以通過例如增加。 xargs -s 8192

在沒有引號的 bash echo刪除回車、制表符和多個空格

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

這是使用ex編輯器Vim 的一部分)的方法:

  • ĴOIN所有行和P RINT到標准輸出:

     $ ex +%j +%p -scq! file
  • ĴOIN就地所有行(在文件中):

     $ ex +%j -scwq file

    注意:這將連接文件本身中的所有行!

我知道解決這個問題的最快和最簡單的方法:

當我們想用空格替換換行符\\n

xargs < file

xargs對每行的字符數和所有字符的組合數有自己的限制,但我們可以增加它們。 可以通過運行以下命令找到詳細信息: xargs --show-limits ,當然在手冊中: man xargs

當我們想用另一個恰好一個字符替換一個字符時

tr '\n' ' ' < file

當我們想用多個字符替換一個字符時

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

可能最好的方法是使用“awk”工具,它將輸出生成為一行

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

它將所有行合並為一個帶有空格分隔符的行

在紅帽 linux 上,我只使用 echo :

echo $(cat /some/file/name)

這給了我一個文件的所有記錄在一行上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM