Bash 脚本中的 Sed 问题

Bash 脚本中的 Sed 问题

我在使用命令时遇到问题sed。我正在尝试编写一个执行以下操作的 bash 脚本:

  1. 搜索包含以下内容的行:@
  2. 然后保存包含的行:@并将其替换为新行

如下所示:

#! /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


相关内容