我在使用命令时遇到问题sed
。我正在尝试编写一个执行以下操作的 bash 脚本:
- 搜索包含以下内容的行
:@
- 然后保存包含的行
:@
并将其替换为新行
如下所示:
#! /bin/bash
echo "Please enter the ip address of you file"
read ipnumber
find=`grep ':@' application.properties` # find the line
input="connection.url=jdbc\racle\:thin\:@$ipnumber\:1521\:billz" # preparing new line
echo `sed "s/'${find}'/'${input}'/g" application.properties` # replace old with new line
问题是:什么也没有发生。
我已经尝试过使用"${find}"
而不是'${find}'
答案1
该代码片段有几个问题。我建议您在用 bash 编写脚本之前,先学习一下它的语法。
无论如何,如果你想编辑一个文件,你需要一个文件编辑器。sed 不是一个文件编辑器。我相信这会满足你的要求。
#!/bin/bash
read -p "Enter the ip address: " ipnumber
ed -s application.properties << EOF
/:@/c
connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz
.
w
EOF
该 ed 脚本的内容是:/:@/c
- 在第一行包含:@
,C将该行与其后的所有内容挂起,直到只包含 的行.
。然后w
到瓦将更改写入文件。
看http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed获得使用 ed 进行编辑的帮助,以及http://mywiki.wooledge.org/BashGuide学习 bash。
更新:
sed 可用于实现相同的功能,但它不能编辑文件,只能用于创建新文件。
# POSIX
sed "/:@/c\
connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz" application.properties
此处 sed 将输出已应用更改的文件。您可以重定向到新文件,然后将该文件移到旧文件上。GNU sed 还有一个非标准-i
选项,可以透明地执行最后一部分。GNU sed 也不要求您在 sed 脚本中包含该换行符。
# GNU sed
sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz" application.properties
请注意,ed 只会取代第一的匹配正则表达式的行,而 sed 将替换全部与该正则表达式匹配的行。
答案2
我的问题是:我使用了一个保留的变量名(值):)
解决方案是:
#!/bin/bash
read -p "Please Enter The ip address : " ipnum
find=`grep ":@" application.properties`
test="connection.url=jdbc:oracle:thin:@$ipnum:1521:e"
sed -i "s/"$find"/"$test"/g" application.properties
谢谢 geirha