Bash
Bash - 在用空格替換換行符之前刪除破折號和換行符
我有一堆格式如下的文本文件:
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accu- sam et justo duo dolores et ea rebum. - Stet clita kasd guber- gren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
如何在命令行上將其列印為連續文本,但刪除行尾的音節劃分:
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
我可以
tr '\n' ' '
用來將換行符轉換為空格問題是
tr
只能替換一個字元,我需要一些命令來-\n
提前刪除。如何在 bash 命令行上實現這一點?
使用
awk
:awk -F'-$' '{ printf "%s", sep $1; sep=/-$/?"":OFS } END{ print "" }' infile
使用,我們將欄位S分隔符
-F'-$'
定義為行尾的單個連字元,因此有了這個並通過採用第一個欄位$1
,對於那些具有此連字元的行,我們將始終擁有沒有該連字元的行,或者對於那些具有該連字元的行仍然是整行沒有那個連字元。然後我們只是簡單地*
sep
*在中間列印它,但是如果目前行以連字元結尾,則在讀取下一行到空字元串時會發生變化,否則為 OFS(輸出欄位S分隔符,預設為空格字元)。在該*
END{...}
*塊中,我們添加了最後一個換行符以使其成為 POSIX 文本文件,如果您不想添加它,只需刪除該部分即可。使用
sed
, 或者:sed ':loop /-$/N;s/-\n//;t loop; N;s/\n/ /;t loop' infile
:環形
- 如果一行以連字元結尾(用 測試
/-$/
),請閱讀下一行並將“連字元+ ewline\n
”替換為空字元串。如果替換成功(使用 測試
t
),則跳轉到標籤循環並處理下一行並跳過執行其餘程式碼。
- 否則,請閱讀N ext 行並將
\n
這兩行之間的嵌入 ewline 替換為空格字元。如果這裡的替換也成功,則跳轉到標籤循環並處理下一行。