Bash

Bash - 在用空格替換換行符之前刪除破折號和換行符

  • May 2, 2021

我有一堆格式如下的文本文件:

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 替換為空格字元。

    如果這裡的替換也成功,則跳轉到標籤循環並處理下一行。

引用自:https://unix.stackexchange.com/questions/647648