echo "col1|col2|col3+++++++++++A|1|a B|2|b C|3|c D|4|d (3 rows)" |sed -e 's/.*\++//; s/d .*/d/; s/|\(.\)|\(.\)\s*/ \1 \2\n/g'
A 1 a
B 2 b
C 3 c
D 4 d
Вы можете w записать адресованный диапазон строк в новый файл, а затем d удалить диапазон -хитрая часть предотвращает выполнение команды d
рассматривается как часть имени выходного файла. В GNU sed вы можете сделать это, разделив запись и удаление на отдельные выражения, используя-e
ВАЖНОЕ ПРИМЕЧАНИЕ :это усекает otherfile
, а не добавляет к нему
sed -i.bak -e '/string/,${w otherfile' -e 'd;}' file
Или используйте ed!
ed -s file <<< $'/textb/,$w otherfile\n/textb/,$d\nw\nq'
Учитывая ваш ввод файла из:
texta
texta1
textb <- string, delete rest of the text from here
textb1
textc
textc1
После выполнения команды ed
файл становится:
texta
texta1
(в конце есть пустая строка, которая исчезает при форматировании здесь ); и другой файл содержит:
textb <- string, delete rest of the text from here
textb1
textc
textc1
Команды ed
— это:
/textb/,$w otherfile
--записать этот диапазон строк в другой файл/textb/,$d
--удалить этот диапазон строк w
--записать измененный файл на диск q
--уволился Если вы используете эту команду sed -n '/string/,$p' file >> otherfile
, чтобы извлечь все строки из одной , содержащей string
, до конца файла($
)в другой файл.
Самый простой способ извлечь дополнение из этого — дополнить соответствие:
sed '/string/,$d' file >> someOtherDifferentFile
И если вы хотите/нужно обновить исходный файл, просто скопируйте результат обратно.
Это то, что делает опция -i
для sed, так что это обновит исходный файл:
sed -i.bak '/string/,$d' file