【问题标题】:Find and replace using sed使用 sed 查找和替换
【发布时间】: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 文件运行时,它使用catmyfile.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 上运行的当前配置以重新开始。这样做之后,它起作用了!我的测试文件中一定有它不喜欢的东西。非常感谢您的帮助!

标签: bash shell sed replace


【解决方案1】:

在第一个命令中,单引号之间的文本没有改变:

cat myfile.txt | sed -r -n 's/$ydate/$date/'

在继续(使用双引号)之前,我建议摆脱cat

sed -r -n 's/$ydate/$date/' myfile.txt 

下一个命令是混合两种输入样式。

cat myfile.rpz | sed "s/$ydate/$date/" myfile.rpz

在这种情况下,cat 的输出被忽略,因为sed 已经在其参数中找到了一个输入文件。这一行应该是

sed "s/$ydate/$date/" myfile.rpz

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2019-11-29
    • 2018-10-01
    • 2017-11-11
    • 2015-01-04
    • 2020-06-24
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多