Замените или добавьте строку к файлу

Я знаю, что sed может заменить часть строки в текстовом файле как это:

sed -i 's/oldstring/newstring/g' test.txt

Но, как я заменяю строку, если она существует, и автоматически добавьте его на новой строке, если она не существует?

Спасибо.

Редактирование: Спасибо за Ваши ответы. Согласно запросам на Ваших комментариях и ответе, вот больше деталей:

  • Я хочу проверить существование старой строки и заменить его новой строкой, если это существует.
  • Я хочу добавить новую строку в новой строке в конце txt файла, если старая строка не существует
  • Если бы существует несколько происшествий той же строки, это была бы ошибка, так как это - файл конфигурации. Другие происшествия могут быть удалены после замены первого происшествия.
4
задан 21 November 2015 в 04:59

3 ответа

Один способ сделать это это для обеспечения grep в уравнение. Сначала проверьте, содержит ли файл строку с быстрым grep, и затем добавьте или займите место соответственно:

grep -q string file && 
    sed -i 's/string/newstring/' file || echo "newstring" >> file

Вышеупомянутое является кратким способом записать:

if grep -q string file; then 
    sed -i 's/string/newstring/' file
else
    echo "newstring" >> file
fi

Лично, однако, я использовал бы perl для этого вместо этого. Просто считайте файл однажды и установите переменную на 1, если замена была сделана. Затем в конце добавьте строку, если переменная не 1:

perl -lpe '$i=1 if s/oldstring/newstring/; 
           END{print "newstring" if $i!=1;}' file > tmpfile && mv tmpfile file
9
ответ дан 23 November 2019 в 11:41

Это должно достигнуть того, что требуется:

grep -q "oldstring" test.txt
if [ $? -eq 1 ]; then
    echo "newstring" >> test.txt
else
    sed -i 's/oldstring/newstring/g' test.txt
fi
2
ответ дан 23 November 2019 в 11:41

Использование AWK:

<<<"$(<in)" awk '{if(/foo/){x=sub(/foo/, "bar", $0)};print}END{if(x!=1){print "bar"}}' >in
% cat in1
string oldstring string
% cat in2
string foo string
% <<<"$(<in1)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in1
user@user-X550CL ~/tmp % cat in1
string newstring string
% <<<"$(<in2)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in2
% cat in2
string foo string
newstring
1
ответ дан 23 November 2019 в 11:41

Другие вопросы по тегам:

Похожие вопросы: