Далі буде надруковано відповідність рядків TERMINATE
до кінця файлу:
sed -n -e '/TERMINATE/,$p'
Пояснено: -n
вимикає поведінку sed
друку кожного рядка за замовчуванням після виконання його сценарію на ньому, -e
вказаний скрипт sed
, /TERMINATE/,$
це вибір діапазону адреси (рядка), що означає перший рядок, що відповідає TERMINATE
регулярному виразу (наприклад, grep) до кінця файлу ( $
) , і p
це команда print, яка друкує поточний рядок.
Це буде надруковано з рядка, який слід за збігом рядків TERMINATE
до кінця файлу:
(ПІСЛЯ відповідного рядка до EOF, НЕ включаючи відповідний рядок)
sed -e '1,/TERMINATE/d'
Пояснюється: 1,/TERMINATE/
це вибір діапазону адреси (рядка), що означає перший рядок для введення в 1-й рядок, що відповідає TERMINATE
звичайному виразу, і d
є командою delete, яка видаляє поточний рядок і переходить до наступного рядка. Оскільки sed
поведінка за замовчуванням полягає у друкуванні рядків, вони надрукують рядки після TERMINATE
закінчення введення.
Редагувати:
Якщо ви хочете, щоб рядки були раніше TERMINATE
:
sed -e '/TERMINATE/,$d'
І якщо ви хочете, щоб обидва рядки до і після були TERMINATE
у двох різних файлах за один прохід:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
Файли до і після містять рядок із завершенням, тому для обробки кожного, що вам потрібно використовувати:
head -n -1 before
tail -n +2 after
Edit2:
Якщо ви не хочете жорстко кодувати назви файлів у сценарії sed, ви можете:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
Але тоді вам доведеться уникати $
значення останнього рядка, щоб оболонка не намагалася розширити $w
змінну (зауважте, що зараз ми використовуємо подвійні лапки навколо сценарію замість одинарних лапок).
Я забув сказати, що новий рядок важливий після назви файлів у сценарії, щоб sed знав, що назви файлів закінчуються.
Редагувати: 2016-0530
Себастьєн Клімент запитав: "Як би ви замінили тверду коду TERMINATE
змінною?"
Ви зробите змінну для відповідного тексту, а потім зробите це так само, як попередній приклад:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
використовувати змінну для відповідного тексту з попередніми прикладами:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
Важливі моменти заміни тексту змінними в таких випадках:
- Змінні (
$variablename
), додані до single quotes
[ '
], не "розширяться", але змінні всередині double quotes
[ "
] будуть. Таким чином, ви повинні змінити все , single quotes
щоб , double quotes
якщо вони містять текст , який ви хочете замінити змінну.
- У
sed
діапазонах також містять $
і відразу ж слідують буква , як: $p
, $d
, $w
. Вони також будуть виглядати як змінні , які будуть розширені, так що ви повинні уникнути цих $
символів з зворотної косої межі [ \
] , як: \$p
, \$d
, \$w
.
grep 'TERMINATE' file