Bash
如何在表達式後添加新行
我有一個類似這樣的文件:
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+:
) 或行尾( ) 的數字字元串$
。現在,替換運算符將用它自己和一個換行符替換所有出現的第一個模式,它應該會給你想要的輸出。