Shell-Script

使用 sed 從表達式中刪除字元

  • November 1, 2018

我在表單中有一個字元串

  1. >

|a 一些文本、字母或數字。| 一些其他文本字母或數字 |b 文本的一些其他部分 |c 一些其他字母或數字

請注意,條形可以單獨存在,如“數字。|其他”或帶有字元“|a”、“|b”、“|c”等,可能一直到“|z”

但這也可能是

  1. >

|a 沒有任何其他條的標題

換句話說,柱的數量是未知的。

我需要找到兩個與 sed 一起使用的正則表達式:

  1. 第一個,查找 |a 和 |b 或 |b 和 |c 之間的所有文本,依此類推

在 1) 中,例如,

查找 a| 之後的所有文本 但在 b| 之前,產生:

一些文字、字母或數字。| 其他一些文字字母或數字

查找 b| 之後的所有文本 但在 c| 之前,在上面的範例中產生:

文本的其他部分

  1. 需要第二個表達式來查找 |a 之後的所有文本,但不是在 |b 處停止,而是簡單地刪除任何條,單獨刪除 (|),或使用另一個字元 |a、|b、|c 等。

在 1) 例如:

一些文本、字母或數字 一些其他文本 字母或數字 文本的一些其他部分 一些其他字母或數字

假設 GNU 實用程序和一個數據文件data

  1. grep -Po '(?<=\|a).*(?=\|b)' data
Some text, letters or numbers. | Some other text letters or numbers 
  1. sed -r -e 's/^.?*\|a//' -e 's/\|[a-z]?//g' data
Some text, letters or numbers.  Some other text letters or numbers  some other part of text  some other letters or numbers 
Title without any other bars 

根據需要將and更改為and|a等。|b``|c``|d

請注意,這些都不會刪除標記周圍的空格|x,因此您的文本有一個前導空格和一個尾隨空格(兩者都不能在此處顯示)。如果您也希望將其刪除,則需要將其作為模式的一部分包含在內:

grep -Po '(?<=\|a ).*(?= \|b)' data
sed -r -e 's/^.?*\|a ?//' -e 's/ ?\|([a-z] ?)?//g' data

如此處所寫,該sed命令會將小節連接在一起。如果您希望它們之間有空格,只需//將末尾的 更改為/ /.

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