sed - 搜索特殊字符(如下划线)并用短划线代替
问题描述:
我正在寻找解决方案将“_
”符号替换为“-
”。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
。
答
最近我所能做的就是这个:
grep -i "^'url' => 'order-" t.txt | sed -e 's/\([[:alnum:]]*\)[_]/\1-/g'
这需要grep来找到以 “URL” =>“命令 - 线,这将取代每凸显了这条线找到。这不会停止后 -online
答
如果我没有理解好要求,你可以试试这个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'
答
这里是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'
答
随着SED,您可以使用t
(测试)命令来处理你的字符串之间找到的所有_
。
当替换成功,ta
将循环到脚本(:a
)的开始搜索并替换剩余_
:后
sed ":a;s/\('url' => 'order-[^_]*\)_\(.*-online\)/\1-\2/;ta;" file
改变你的样品有几个'_''online'以及..它会更好地显示您的要求。 – Sundeep