2017-11-18 180 views
0

我正在寻找解决方案将“_”符号替换为“-”。sed - 搜索特殊字符(如下划线)并用短划线代替

383 =>. 
    array (     
    'url' => 'order-samsung_s5-online-en.html', 
    'module' => 'product', 
    'action' => 'get',  
    'oid' => '14',   
    'lang' => 'en' 

和更换后,应该是这样的:

383 =>. 
    array (     
    'url' => 'order-samsung-s5-online-en.html', 
    'module' => 'product', 
    'action' => 'get',  
    'oid' => '14',   
    'lang' => 'en' 

可能有其他的下划线(“_”)符号的文本文件,但更换只应在URL中发生,'url' => 'order-之间和-online

+0

改变你的样品有几个'_''online'以及..它会更好地显示您的要求。 – Sundeep

回答

0

最近我所能做的就是这个:

grep -i "^'url' => 'order-" t.txt | sed -e 's/\([[:alnum:]]*\)[_]/\1-/g' 

这需要grep来找到以 “URL” =>“命令 - 线,这将取代每凸显了这条线找到。这不会停止后 -online

0

如果我没有理解好要求,你可以试试这个sed的对包含订单的行顺序之间的在线

sed -E '/order/!b;s//&\n/;s/online/\n&/;h;s/\n.*\n/\n/;x;s/[^\n]*\n([^\n]*).*/\1/;s/_/-/g;x;G;s/([^\n]*)\n([^\n]*)\n(.*)/\1\3\2/' infile 

第一独立的文本。

在此行上操作_到 - 的替换。

重新排列完整的行。

猫INFILE

383 =>. 
    array (     
    'url' => 'order-samsung_s5-online-en.html', 
    'module' => 'product', 
    'action' => 'get',  
    'oid' => '14',   
    'lang' => 'en' 

输出

383 =>. 
array (     
    'url' => 'order-samsung-s5-online-en.html', 
    'module' => 'product', 
    'action' => 'get',  
    'oid' => '14',   
    'lang' => 'en' 
+0

它的工作原理!但它会克隆文件的每个字符串。目标字符串除外。 – vnr

+0

对不起,我不明白你想说什么。所以我用测试输入文件和输出更新我的答案。 –

+0

对不起。样本被添加 – vnr

1

这里是awk只有两个字符串之间替换字符的解决方案。我认为第一个总是在排的开头。

awk '/^(\047)url(\047) => (\047)order-/ { 
     i=index($0,"-online") 
     interesting=substr($0,0,i-1) 
     gsub(/_/,"-",interesting) 
     $0=interesting substr($0,i) 
} 1' file 
  • \047)是用于转义单引号值八进制。
  • index(),直到该指数给出了有趣的部分
  • gsub()在字符串替换字符,并将结果分配给它返回行字符串的第一次出现的索引(或零,如果未找到)
  • substr()
  • 1打印行

测试文件

some_text 
'url' => 'order-word_word1-online-es.html', 
'url' => 'order-word_word1_word2-online-es.html', 
'url' => 'order-word_word1_word2_word3-online-es.html', some_text 
some_text 
'url' => 'order-word_offline.html' 

输出

some_text 
'url' => 'order-word-word1-online-es.html', 
'url' => 'order-word-word1-word2-online-es.html', 
'url' => 'order-word-word1-word2-word3-online-es.html', some_text 
some_text 
'url' => 'order-word_offline.html' 
1

随着SED,您可以使用t(测试)命令来处理你的字符串之间找到的所有_

当替换成功,ta将循环到脚本(:a)的开始搜索并替换剩余_:后

sed ":a;s/\('url' => 'order-[^_]*\)_\(.*-online\)/\1-\2/;ta;" file