Сохранение возвращаемого значения функции в файле - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу удалить из файла определенную строку, которая хранится в $ temp.Мой способ сделать это будет: sed - выделение строки и затем перезапись исходного файла.Это функция, с которой я работаю

cat actual.dat| cut -f2 -d ' '| sed -n "/$temp/!p"  actual.dat

с cat , она возвращает идеальный формат для меня, естественно, я бы продолжил примерно так, но это не такрабочая причина некоторой синтаксической ошибки или idk.

cat actual.dat| cut -f2 -d ' '| sed -n "/$temp/!p"  actual.dat > actual.dat

Если я сохраню возвращаемое значение функции в переменной, я потеряю все мои \ n -ы, и все будет в одной строке, которого я хочу избежать.

Как мне это сделать?

1 Ответ

0 голосов
/ 15 ноября 2018

Ваш скрипт имеет несколько проблем.

  1. При вызове sed с именем файла он больше не читает stdin формы. Поэтому все, что осталось от канала (|), игнорируется и просто печатается.
  2. Вы не можете 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...