在bash中对变量进行多个正则表达式替换?

时间:2011-09-28 15:24:47

标签: regex bash

我想知道是否有办法在bash中进行多个正则表达式替换 $ {string // substring / replacement}或者可能存在更好的解决方案。

我有一个脚本通过curl向statusnet和friendika发送更新。 例如,我在网上签署请愿书,并且我可以发送推文,但宁愿发送到identica。我厌倦了粘贴东西,不得不在终端编辑以逃避@和#,!和? 我想在我的脚本中使用regexp替换它们以自动更改

@repbunghole and @SenatorArsehat Stop farking around with #someship! Do you want me to come smack you? | http://someshort.url

\@repbunghole \@SenatorArsehat Stop farking around with \#someship\! Do you want me to come smack you\? \| http://someshort.url

我没有强大的sed或awk fu,但想象他们可能会提供解决方案,我不知道如何使用sed而不将变量写入文件,读取文件并对其进行操作,然后设置var var = $(cat文件)。是。我对这个东西很陌生。 我没有找到足够的数据与上面的$ {string // substring / replacement /}进行多次替换。运行X次以逃避X个不同的字符似乎效率低下。

read -p "Enter a string: " a
b=${a//\@/\\\@}
c=${b//\#/\\\#}
d=${c//\!/\\\!}
e=${d//\?/\\\?}
f=${e//\"/\\\"}
g=${f//\'/\\\'}
等等等 在此期间工作,但它很难看......

2 个答案:

答案 0 :(得分:7)

这就是character classes的用途:

b=${a//[@#!?"']/\\\0}

答案 1 :(得分:4)

用于“在bash中对变量进行多个正则表达式替换?”

sed和awk都可以做到。 例如,我想要替换

a->1
b->2
c->3

sed

kent$  v=abc
kent$  newV=$(sed -e's/a/1/; s/b/2/; s/c/3/' <<< $v)
kent$  echo $newV2
123

awk

kent$  v=abc
kent$  newV2=$(awk '{gsub(/a/,"1");gsub(/b/,"2");gsub(/c/,"3")}1' <<< $v)                                                                
kent$  echo $newV                                                        
123