【发布时间】:2020-08-05 18:40:56
【问题描述】:
我正在尝试使用 cat 和 sed 创建单行查找和替换来完成 shell 脚本中的任务。这是我目前所处的位置:
myscript.sh 包含以下内容:
date=$(date '+%Y%m%d'01)
ydate=$(date -d yesterday '+%Y%m%d'01)
cat myfile.txt | sed -r -n 's/$ydate/$date/'
这就是我所期待的:$ydate 和$date 的变量分别设置为yyyymmdd01 格式的日期。当myscript.sh 文件运行时,它使用cat 将myfile.txt 的输出(myfile.txt 包含所示格式的昨天日期)传送到sed 命令。 sed 然后将 cat 输出定位到昨天的日期,并以正确的格式将其替换为今天的日期。
到目前为止,这还没有按要求工作。
我也尝试在sed 命令周围使用“”,而不使用-n,并且我尝试在sed 命令之后指定文件myfile.txt。它仍然不会找到字符串并替换它。
任何人都可以帮助我如何让它按预期运行吗?
提前致谢!
编辑: myscript.sh 内容:
#!/bin/sh
cd /var/named
date=$(date '+%Y%m%d'01)
ydate=$(date -d yesterday '+%Y%m%d'01)
# This line creates the serial number of the file
cat myfile.rpz | sed "s/$ydate/$date/" myfile.rpz
# This line opens the file at the end for easier editing
#nano +999999999 myfile.rpz
# This line restarts the named service, waits 5 seconds, then closes.
#service named restart
#sleep 5s
#exit
myfile.rpz 内容:
$TTL 600
@ IN SOA dns1.mysite.com. root.localhost. (
2020042101 ; serial
1h ; refresh
30m ; retry
1w ; expiry
30m) ; minimum
IN NS localhost.
dns1.mysite.com IN A 172.16.1.18
dns2.mysite.com IN A 172.16.2.18
; Redirect this site to localhost to block
; List last consolidated on 12/11/2018
; DNS Blocks
*.mad IN CNAME *.
beans.com A 127.0.0.1 ; this is a test case
*.000webhostapp.com A 127.0.0.1
*.00h5.com A 127.0.0.1
*.00webhostapp.com A 127.0.0.1
【问题讨论】:
-
删除
-n,删除-r,使用双引号,它应该可以工作。使用set -x调试您的脚本。 -
@KamilCuk 我按照你的建议试过了,它仍然没有找到日期并替换它。感谢您的建议!
-
您需要在正则表达式两边加上双引号,以便评估变量。你不需要
-n,也不需要-r。我做了一个快速测试,假设您的myfile.txt具有您实际认为的内容并且与$ydate匹配,那么它应该可以工作(省略-n并使用双引号)。所以,请出示您的myfile.txt以及您的$ydate在这种情况下的值。 -
我将获取这两个文件并在此处显示。
-
@lurker,我让它工作了!在您确认它应该可以工作后,我复制了在 myfile.rpz 上运行的当前配置以重新开始。这样做之后,它起作用了!我的测试文件中一定有它不喜欢的东西。非常感谢您的帮助!