Ваш скрипт имеет несколько проблем.
- При вызове sed с именем файла он больше не читает stdin формы. Поэтому все, что осталось от канала (
|
), игнорируется и просто печатается.
- Вы не можете
cat
файл и записать >
в него в том же канале, поскольку >
удаляет содержимое до того, как cat
прочитает его.
Кажется, у вас есть значение в $temp
, которое нужно найти во втором поле (cut -f2 -d ' '
), чтобы указать, какую строку удалить.
Решением было бы найти номер строки с помощью grep, а затем удалить эту строку с помощью sed.
linenumber=$( cat actual.dat | cut -f2 -d ' ' | grep -n -m1 "$temp" | cut -f1 -d: )
sed -i "$linenumber"'d' actual.dat
Редактировать: Я только что понял, что если строка не найдена, скрипт выше удаляет все строки
Лучше:
deletelines=$( cat actual.dat | cut -f2 -d ' ' | grep -n "$temp" | cut -f1 -d: | sed 's/$/d/' | tr '\n' ';')
sed -i "$deletelines" actual.dat
(deletelines
будет содержать 10d;15d;
в случае, если 10-я и 15-я строки найдены grep
)
Соответствующая документация:
-п
--line номер
Префикс каждой строки вывода с номером строки в своем входном файле.
(man grep
)
-i [SUFFIX], --in-place [= SUFFIX]
редактировать файлы на месте (делает резервную копию, если расширение предоставлено). Режим работы по умолчанию -> разрыв символических и жестких ссылок. Это можно изменить с помощью --follow-symlinks и --copy.
[...]
д
Удалить шаблон пространства. Начать следующий цикл.
[...]
Поддерживаются следующие типы адресов:
номер
Соответствует только указанному номеру строки.
(man sed
)