尝试编写一个bash文件来查找字符串的特定模式,并使用shell脚本从命令行arg替换为新字符串?

时间:2017-04-16 05:56:36

标签: bash shell sed

我正在尝试编写一个bash文件,使用shell脚本在.txt文件中查找字符串,并希望将其替换为新字符串。

我正在尝试的字符串模式{{asdf}},我想从命令行arg中用ghjk替换它。

我尝试使用以下bash文件:

ptr="\{\{(.*?)\}\}"
username="$1"
password="$2"
sed 's/$ptr/${username}/g' new.txt
sed 's/$ptr/${password}/g' sec.txt

但它不起作用。

3 个答案:

答案 0 :(得分:0)

您需要使用双重代码才能将vars替换为其值 如果+告诉至少一次,您可以使用

ptr="{{.\+}}"
sed "s/$ptr/${username}/g" usertemplate.txt > new.txt

使用sed作为密码将是一个挑战,因为特殊字符(不要告诉别人,我的密码是/\\[.*&{7z)。
你可以试试像

这样的东西
ptr="{{.\+}}"
username='/\\[.*&{7z'
escapedname=$(sed 's/[&=\/|]/\\&/g'  <<< "$username")
sed "s/$ptr/${escapedname}/g" usertemplate.txt

编辑:我首先试图逃避大多数角色,但这对我来说很难 我把它改成了最小版本。我希望这个更好。

答案 1 :(得分:0)

您应该注意的一件事是 <!DOCTYPE HTML> <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script type="text/javascript"> var initialDate = new Date(2012, 11, 1); // Dec 1st 2012 var now = Date.now(); var difference = now - initialDate; var millisecondsPerDay = 24 * 60 * 60 * 1000; var daysSince = Math.floor(difference / millisecondsPerDay); document.getElementById('show').innerHTML = daysSince.toString(); </script> </head> <body> <p id="show"></p> </body> </html> 单引号在shell编程中具有特殊含义。单引号否定变量,即它们不允许您访问变量的内容,而只是变量的名称。

您需要做的是删除单引号''并用双引号括起来,即's/$ptr/${username}/g'

更好的是,如果你想使用单引号,你应该在这里使用字符串,就像指定walter一样。这里的字符串可以使用"s/$ptr/${username}/g"完成。如果你决定在这里使用字符串,代码的逻辑将完全改变。

答案 2 :(得分:-1)

只需使用awk:

username="$1" awk '
{
    gsub(/}}/,"\n")
    delete a
    if ( match($0,/{{[^\n]+\n/) ) {
        a[1] = substr($0,1,RSTART-1)
        a[2] = ENVIRON["username"]
        a[3] = substr($0,RSTART+RLENGTH)
    }
    else {
        a[1] = $0
    }
    gsub(/\n/,"}}",a[1])
    gsub(/\n/,"}}",a[3])
    print a[1] a[2] a[3]
}
' new.txt

以上内容适用于username的任何值,如果/ {{foo}(只有一个})出现在输入中,则不会失败。重复密码。在awk命令行上设置shell变量username非常重要,如图所示,因此可以通过ENVIRON数组获取awk而无需导出它。