У меня есть текстовый файл, содержащий следующие строки:
This is the first line
Second line
I have a mac
Used to have windows
Comfortable with both
Таким образом, теперь я хочу к grep, "Я имею Mac" и перемещаю все содержание, которое следует в новый файл. Как я делаю это?Спасибо!
Обрежьте все от строки, которые содержат, "Я имею Mac" в конец файла и пишу вывод в новый файл:
sed -n '/I have a mac/,$ p' in-file > out-file
Удалите все из строки, которые содержат, "Я имею Mac" в конец файла, вношу изменения вместо файла и создаю резервную копию исходного файла:
sed '/I have a mac/,$ d' in-file -i.bak
Используйте переменную, которые содержат строку, которую Вы ищете и условно выполняете вышеупомянутые две команды:
SEARCH='I have a mac'
sed -n "/$SEARCH/,$ p" in-file > out-file && sed "/$SEARCH/,$ d" in-file -i.bak
Используйте grep для нахождения (рекурсивно), какой файл (файлы) содержит искавшую строку, и передайте ее имя через канал и xargs
к вышеупомянутым командам (ссылка):
export SEARCH='I have a mac'
grep -lr "$SEARCH" | xargs -L1 -I {} sh -c 'sed -n "/$SEARCH/,$ p" {} > {}.out && sed "/$SEARCH/,$ d" {} -i.bak'
С grep
Вы могли использовать -A
переключатель (-> После Контекста) и | tail -n+2
запустить вывод со второй строки для пропуска соответствия.
grep -A $(wc -l < file) mac file | tail -n+2
Но использование sed
вероятно, лучше для этого случая:
sed '1,/mac/d' file
Это удаляет все из первой строки (1) до и включая согласующий отрезок длинной линии.
или Вы могли использовать awk
:
awk '{if(m)print}/mac/{m=1}' file
распечатает строку, когда переменная m будет верна if(m)print}
, который установлен на 1/верный после первого соответствия /mac/{m=1}
.
"Передача" stdout
от команды до файла может быть сделан с перенаправлением: > another_file
sed '1,/mac/d' file > another_file
#or
awk '{if(m)print}/mac/{m=1}' file > another_file