regex - 如何将 vim 正则表达式替换命令转换为 sed 或 awk?

标签 regex linux bash awk sed

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

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

解释

  • :%: 完成缓冲区
  • s/:替换
  • \v:使用正则表达式魔法...坦率地说,我仍然不明白这一点
  • \n:匹配新行
  • (\D):匹配“不是数字”。用大括号括起来以将其标记为组
  • /\1/g:用空格和第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

输出

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

最佳答案

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

关于regex - 如何将 vim 正则表达式替换命令转换为 sed 或 awk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49347292/

相关文章:

linux - 在 bash 脚本中正确使用退格函数

python - 根据有趣单词的字典从电子邮件列表中识别最常见的单词

linux - Grep:复制包含特定文本的链接

c++ - 无法用 64 位 g++ 编译 32 位

linux - 在 docker 容器中运行的应用程序在 docker 主机中无法访问

java - 如何使用正则表达式检查 Java 中的确切电话号码

regex - VIM:选择一个正则表达式,然后应用一个命令

Linux内核 panic

regex - 与 awk 一起使用的正则表达式中的量词表现出意外

javascript - 用于匹配有效 JavaScript 命名空间的正则表达式