Bash

如何在表達式後添加新行

  • August 3, 2017

我有一個類似這樣的文件:

random_string
83: some words 45: large error report 326: send emails to certain peple
random_string
34: some words 143: job success

我想定位模式“#:”(一個數字後跟一個冒號)並在它後面的文本之後添加一個新行;所以它看起來像這樣:

random_string
83: some words
45: large error report
326: email certain people

random_string
34: some words
143: job success

我嘗試了以下 sed 命令:

sed "s#'([0-9]*[0-9]:)'#a '/n'#" file.txt
sed "s#'([0-9]*[0-9]:)'#\n#g" file.txt

(我不喜歡使用斜線作為分隔符,柵欄柱很難閱讀)

和一個 awk 命令:

awk '/[0-9]*[0-9]:/ {printf "%s\n",$0}' file.txt

兩者都沒有奏效。我查看了此處發布的類似問題並嘗試了他們的解決方案,但沒有任何效果。我知道答案很可能非常相似,甚至可能與我的數字表達式中的語法有關,但我自己無法弄清楚。我不喜歡 awk 或 sed,但我認為它們將是我可以使用的最佳工具。

幫助?

這是一個 Perl 解決方案:

$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words 
45: large error report 
326: send emails to certain peple

random_string
34: some words 
143: job success

解釋

  • (\d+:.*?): 匹配一個或多個數字 ( \d+) 後跟 a :,然後是匹配正則表達式其餘部分的最小字元串(?in.*?使其非貪婪,一旦找到第一個匹配項就會停止)。在這裡,它將一直持續到下面解釋的部分。
  • (?=\d+:|$): 這(?=foo)叫做正向前瞻。它會匹配,但匹配的內容不會包含在實際結果中。因此,bar(?=foo)將匹配所有bar跟在後面的情況foo。在這裡,我們正在查找後跟:( \d+:) 或行尾( ) 的數字字元串$

現在,替換運算符將用它自己和一個換行符替換所有出現的第一個模式,它應該會給你想要的輸出。

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