如何将vim regex replace命令转换为sed或awk?

时间:2018-03-18 11:22:46

标签: regex linux bash awk sed

如何应用这个命令我在vim中使用sed或awk?

:%s/\v\n(\D)/ \1/g

说明

  • :%:完整缓冲区
  • s/:替换
  • \v:使用正则表达式魔法......我坦率地说仍然不明白这个
  • \n:匹配新行
  • (\D):匹配'不是数字'。被括号括起来将其标记为群组
  • / \1/g:将匹配替换为空格和组1
  • /g:确认替换所有出现的情况

INPUT

Datum   Transaktion Branche/Partner Verrechnet  Belastung   Gutschrift  Bonuspunkte
24.12.2017  "Zinsen*
Zinsperiode: vom 24.11. bis 24.12.
Zins auf EUR 23'001'011.43 vom 20.12.-20.12. EUR 121.31
Zins auf EUR 23'002'045.73 vom 21.12.-23.12. EUR 173.99
Zins auf EUR 23'006'067.38 vom 24.12.-24.12. EUR 191.33"        Ja  239.42      0.0
23.12.2017  "Acme Ent.
Lebensmittelgeschäft
"   Lebensmittelgeschäft   Ja  121.65      121.7
20.12.2017  "Restaurant Lorem ipsum
Restaurant
"   Restaurant  Ja  15.00       15.0

输出

Datum   Transaktion Branche/Partner Verrechnet  Belastung   Gutschrift  Bonuspunkte
24.12.2017  "Zinsen* Zinsperiode: vom 24.11. bis 24.12. Zins auf EUR 23'001'011.43 vom 20.12.-20.12. EUR 121.31 Zins auf EUR 23'002'045.73 vom 21.12.-23.12. EUR 173.99 Zins auf EUR 23'006'067.38 vom 24.12.-24.12. EUR 191.33"        Ja  239.42      0.0
23.12.2017  "Acme Ent. Lebensmittelgeschäft "   Lebensmittelgeschäft    Ja  121.65      121.7
20.12.2017  "Restaurant Lorem ipsum Restaurant "    Restaurant  Ja  15.00       15.0

3 个答案:

答案 0 :(得分:2)

Awk 等价物如下所示:

awk '{ printf "%s%s", (NR==1? "" : (/^[0-9]/? ORS : OFS)), $0 }END{ print "" }' file
  • OFS - 输出字段分隔符(默认为空格字符)
  • ORS - 输出记录分隔符

输出:

Datum   Transaktion Branche/Partner Verrechnet  Belastung   Gutschrift  Bonuspunkte
24.12.2017  "Zinsen* Zinsperiode: vom 24.11. bis 24.12. Zins auf EUR 23'001'011.43 vom 20.12.-20.12. EUR 121.31 Zins auf EUR 23'002'045.73 vom 21.12.-23.12. EUR 173.99 Zins auf EUR 23'006'067.38 vom 24.12.-24.12. EUR 191.33"        Ja  239.42      0.0
23.12.2017  "Acme Ent. Lebensmittelgeschäft "   Lebensmittelgeschäft    Ja  121.65      121.7
20.12.2017  "Restaurant Lorem ipsum Restaurant "    Restaurant  Ja  15.00       15.0

答案 1 :(得分:0)

sedperl解决方案:

<强> perl的

tr -d '\v\n\r' < input.txt | perl -pe 's/(\d{2}\.\d{2}\.\d{4})/\n\1/g'

<强> SED

tr -d '\v\n\r' < input.txt | sed 's/\([0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{4\}\)/\n\1/g'

<强>输出:

Datum   Transaktion Branche/Partner Verrechnet  Belastung   Gutschrift  Bonuspunkte
24.12.2017  "Zinsen* Zinsperiode: vom 24.11. bis 24.12. Zins auf EUR 23'001'011.43 vom 20.12.-20.12. EUR 121.31 Zins auf EUR 23'002'045.73 vom 21.12.-23.12. EUR 173.99 Zins auf EUR 23'006'067.38 vom 24.12.-24.12. EUR 191.33"        Ja  239.42      0.0
23.12.2017  "Acme Ent. Lebensmittelgeschäft "   Lebensmittelgeschäft    Ja  121.65      121.7
20.12.2017  "Restaurant Lorem ipsum Restaurant "    Restaurant  Ja  15.00       15.0

<强>说明:

tr命令会删除所有\v\n\r字符,然后sed命令会在每个日期之前添加新行元素来创建CSV结构。

答案 2 :(得分:0)

或者只在批处理模式下使用vim :)慢大约8倍,但这是一个选择。

echo '%s/blah/BLAH/ | w'|vi -e file.cfg

来源: https://www.brianstorti.com/vim-as-the-poor-mans-sed/