Я знаю, что sed может заменить часть строки в текстовом файле как это:
sed -i 's/oldstring/newstring/g' test.txt
Но, как я заменяю строку, если она существует, и автоматически добавьте его на новой строке, если она не существует?
Спасибо.
Редактирование: Спасибо за Ваши ответы. Согласно запросам на Ваших комментариях и ответе, вот больше деталей:
Один способ сделать это это для обеспечения 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
Это должно достигнуть того, что требуется:
grep -q "oldstring" test.txt
if [ $? -eq 1 ]; then
echo "newstring" >> test.txt
else
sed -i 's/oldstring/newstring/g' test.txt
fi
Использование 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