vim – Ein Problem bei der Verwendung regulärer Ausdrücke für die Textverarbeitung mit vi/shell
黄舟
黄舟 2017-05-16 16:42:06
0
1
880

Die Anforderungen sind wie folgt:

Eingabedatei input.txt:
a1
a2
a3
a4
b1
b2
a5
b3
b4
b5

Die erforderliche Ausgabedatei „output.txt“ lautet:
a1
a4
b1
b2
a5
b3
b5

Das heißt, entfernen Sie die N-te Zeile. Die Bedingung, die N erfüllt, ist: Die ersten Buchstaben der N-ten Zeile und der N-1- und N+1-ten Zeile sind gleich (die erste und die letzte Zeile werden nicht entfernt).

Kann ich den Ersatzbefehl oder die Shell von vi verwenden, um diese Anforderung zu erfüllen? Ich hätte auch gerne ein paar Tipps, danke. (Ich habe es mit C++ implementiert, jetzt möchte ich nur wissen, ob es mit regulären Ausdrücken implementiert werden kann)

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

Antworte allen(1)
黄舟

vim的正则

%s/\v((.).*\n)((\2.*\n)+)(\2.*$)/\1\5/g

分成三段解释一下

((.).*\n)
匹配第一行,外层分组用于替换的时候反向引用,内层分组用于后面判断

((\2.*\n)+)
匹配接下来 以上一行第一个字母开头的行(1行或多行)

(\2.*$)
匹配一行以第一行第一个字母开头的行

最后 \1\5 把上面匹配到的所有的行 替换成第一行和最后一行,即删除中间的行

注:最开始的\v是切换到perl正则模式,这样括号、加号就不需要转义了

BTW 这种文本处理的工作用perl脚本完成是最方便的,vi的好处是可视化调试,但是遇到大文件就GG了

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage