如何在脚本中使用sed就地替换脚本中的模式

时间:2015-07-07 13:48:36

标签: bash sed

下面是我的测试脚本,其中我试图在运行时替换脚本中的一行。

/home/xxx/test.sh

#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'

u="$(grep 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"

sed -i "s/user=/user="${u}"/3" "$SCRIPT_PATH"
sed -i "s/pass=/pass="${p}"/3" $SCRIPT_PATH

user=
pass=

问题:sed实际上是在这里替换搜索模式。我试过" 3"最后希望它将针对文件中的第3次出现,但这并没有按预期工作。

我想用user = admin替换最后一个user =和pass =并传递=' pass1234'

任何建议。还在努力。

OUTPUT我希望文件更改为:

#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'

u="$(grep 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"

sed -i "s/user=/user="${u}"/3" "$SCRIPT_PATH"
sed -i "s/pass=/pass="${p}"/3" $SCRIPT_PATH

user=admin
pass='pass1234'

3 个答案:

答案 0 :(得分:1)

您应该使用self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle) 只获取用户名和密码的第一个匹配项。您可以使用self.tableViewgrep -m 1来匹配您想要更改的行:

^user=

输出是:

^pass=

答案 1 :(得分:1)

我完全使用了Nathan建议的内容,除了我匹配sed正则表达式中的行尾[ - {1}}和user=$。这样,如果脚本多次运行,则不会再次将“admin”和“'pass1234'”添加到admin=$user=

admin=

答案 2 :(得分:0)

您可以在脚本中使用此sed命令而不是那两个sed命令(它使用扩展的正则表达式):

sed -nr 's@(user|pass)\w+=(.*)@s/^\1=$/\&\2/@p' "$SCRIPT_PATH" |sed -ri -f- "$SCRIPT_PATH"

<小时/> 例如:

剧本:

#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'

u="$(grep -m 1 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep -m 1 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"

sed -nr 's@(user|pass)\w+=(.*)@s/^\1=$/\&\2/@p' "$SCRIPT_PATH" |sed -ri -f- "$SCRIPT_PATH"

user=
pass=

将更改为:

#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'

u="$(grep -m 1 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep -m 1 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"

sed -nr 's@(user|pass)\w+=(.*)@s/^\1=$/\&\2/@p' "$SCRIPT_PATH" |sed -ri -f- "$SCRIPT_PATH"

user=admin
pass='pass1234'