Найти и заменить с помощью sed - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать поиск и замену в одну строку, используя cat и sed, чтобы выполнить задачу внутри сценария оболочки. Вот где я сейчас нахожусь:

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, и я попытался указать файл myfile.txt после команды sed. Он все равно не найдет строку и не заменит ее.

Может кто-нибудь предложить мне некоторую помощь в том, как мне заставить это работать так, как задумано?

Заранее спасибо!

РЕДАКТИРОВАТЬ: 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

1 Ответ

0 голосов
/ 22 апреля 2020

В первой команде текст между одинарными кавычками не изменяется:

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

Прежде чем двигаться дальше (используя двойные кавычки), предлагаю избавиться от cat:

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

Следующая команда смешивает 2 стиля ввода.

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

В этом случае вывод cat игнорируется, поскольку sed уже находит входной файл в своих параметрах. Эта строка должна быть

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