Jak mogę zastąpić następujący tekst w pliku w Linuksie z inną linią

Obecny :

0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log

Linia wymiany: #line_removed

Próbowałem użyć SED, ale mój tekst w pliku ma już / co powoduje problemy. Próbowałem również przechowywać ciąg w zmiennej. Ale to nie działa

#!/bin/bash

var="0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log"

sed -i -e 's/$var/#line_removed/g' /tmp/k1.txt

Wyjście

1
Karthik Rao V 16 luty 2017, 12:44

2 odpowiedzi

Najlepsza odpowiedź

Sugeruję poprzednią nakarmić zawartość $var do skryptu SED, aby uciec wszystkie znaki /, aby być \/, jak w:

var_esc=$(echo "$var" | sed 's/\//\\\//g')

Ale ekspresja sed staje się bardzo skomplikowana (musisz używać pojedynczych cytatów, jeśli nie chcesz podwoić znaki \, ponieważ podwójne cytaty interpretuje również odwrotki.

Inną rzeczą, która mogłaby uprościć wyrażenie polega na wykorzystaniu możliwości zmiany ogranicznika REGEXP (przy użyciu innego znaku, aby go rozpocząć) jak w:

var_esc=$(echo "$var" | sed 's:/:\/:g')

Ideą jest, przed zastąpieniem zmiennej {x0}}, aby uniknąć wszystkich możliwych znaków interferringowych, które możesz mieć (nie znasz priory, jeśli będzie, jak będzie, jak używasz zmiennej w tym celu) a następnie zastąp je w końcowym poleceniu:

sed "s/$var_esc/#line_removed/g"

Wreszcie, jeśli nie chcesz zastąpić linii, ale tylko po to, by go wymazać, możesz zrobić coś takiego:

sed "/$var_esc/d"

I to usunięcie wszystkich linii pasujących do treści $var_esc. (Tym razem wierzę, że nie można zmienić ogranicznika REGEXP, ponieważ / wprowadza operator Matching Line --- d to polecenie, aby usunąć linię w wyjściu)

Innym sposobem na usunięcie linii w pliku jest zadzwonić bezpośrednio ex i przekazać polecenie edytora jako wejście:

ex file <<EOF          <-- edit "file" with the commands that follow until EOF is found.
/$var_esc              <-- search for first occurrence of $var_esc
d                      <-- delete line
w                      <-- write file
EOF                    <-- eof marker.
-1
Luis Colorado 17 luty 2017, 06:24

Tylko / nie jest tutaj problemem, nawet {x1}} lub wszystkie specjalne znaki meta regex będą problemem dla sed, ponieważ używa tylko regexa do wzorców wyszukiwania.

Lepiej użyć tego non-regex polecenia awk:

awk -v var="$var" 'index($0, var) { $0 = "#line_removed" } 1' file

#line_removed

index Funkcja w awk używa prostego wyszukiwania tekstowego zamiast wyszukiwania opartego na regex.

1
anubhava 16 luty 2017, 09:54