sed - 搜索下划线等特殊字符并用短划线替换

时间:2017-11-18 13:07:53

标签: linux bash sed

我正在寻找用“ todolist.append(item) ”替换“_”符号的解决方案。

-

并且在更换后它应该如下所示:

  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' => 'order-之间的网址中进行替换。

4 个答案:

答案 0 :(得分: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()返回行中字符串的第一次出现的索引(如果未找到,则返回零)
  • substr()直到此索引给出有趣的部分
  • gsub()替换字符串中的字符并将结果分配给它。
  • 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 :(得分:1)

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

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

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

答案 2 :(得分:0)

我能做的最近的就是:

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

这需要grep来查找以。开头的行 'url'=> '订购- 这将替换此行中的每个下划线。这不会停止 -online

答案 3 :(得分: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

首先在包含订单的行上将订单和在线文本分开。

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

重新排列整行。

cat 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'