2013-03-06 123 views
1

我有一些字符串,如:替换模式命令

样品输入:

Also known as temple of the city, 
xxx as Pune Banglore as kolkata Delhi India, 
as Mumbai India or as Bombay India, 
Calcutta,India is now know as Kolkata,India, 

从上面我想为XXX XXXX的XX,转换为为xxx_xxxx_xx,它应在最后后生效。

示例输出以上:

Also known as temple_of_the_city, 
xxx as Pune Banglore as kolkata_Delhi_India, 
as Mumbai India or as Bombay_India, 
Calcutta,India is now know as Kolkata,India, 

有应该是最后作为行之后没有空格隔开字符串。

请让我知道,如果它不明确。 谢谢

+0

没有第二个'xxx'在输出的第二行从哪儿来的? – 2013-03-06 19:51:39

+0

对不起,我编辑过它。 – par181 2013-03-06 19:53:29

回答

2

保罗是对的,这不是一个简单的任务。这是一个sed的解决方案,我放在一起:

sed 's/\(.*as \)/\1\n/;h;y/ /_/;G;s/.*\n\(.*\)\n\(.*\)\n.*/\2\1/' file.txt 

演示您的数据:

$ echo 'Also known as temple of the city, 
> xxx as Pune Banglore as kolkata Delhi India, 
> as Mumbai India or as Bombay India, 
> Calcutta,India is now know as Kolkata,India,' | \ 
> sed 's/\(.*as \)/\1\n/;h;y/ /_/;G;s/.*\n\(.*\)\n\(.*\)\n.*/\2\1/' 
Also known as temple_of_the_city, 
xxx as Pune Banglore as kolkata_Delhi_India, 
as Mumbai India or as Bombay_India, 
Calcutta,India is now know as Kolkata,India, 
+0

@zzk'echo“她长达两个小时”| sed's /\(.* as \)/ \ 1 \ n /; h; y//_/;G;s/.*\n\(.*\)\n\(.*\)\n 。*/\ 2 \ 1 /''在'GNU sed'上对我有效。 – 2013-03-06 20:20:02

+0

当我将其复制到我的终端时,可能会发生一些微妙的变化。无论如何。 – zzk 2013-03-06 20:22:47

+0

@zzk如果你有任何机会在Mac上,这将解释它。 'sed'在OS X中的工作方式不同。 – 2013-03-06 20:24:02

1

我会倾向于使用瑞士军队的电锯Perl,但sed也是一种选择。无论哪种情况,您都在寻找实质性的学习曲线。

您所描述的替换可能非常复杂,以至于您最好写一个脚本,而不是尝试将它作为一个班轮。

如果你要编写一个脚本并且不知道Perl,没有理由不选择你选择的脚本语言(python,ruby等),只要它有某种文本模式匹配语法。

我不知道做一个复杂的模式匹配和替换这种简单,浅学习曲线的方法。这是一次性的事情,你只需要做这个替换?或者你将来会做类似的复杂模式替换。如果你经常这样做,你应该花时间学习一些脚本语言,但是我不会把你的Perl偏见强加给你。只需选择任何似乎可以访问的语言。