Как удалить все строки в файле, начиная с соответствующей строки?
У меня есть файл, состоящий из нескольких строк текста:
The first line
The second line
The third line
The fourth line
У меня есть строка, которая является одной из строк: The second line
Я хочу удалить строку и все строки после нее в файле, поэтому она будет удалять The third line
и The fourth line
в дополнение к строке. Файл будет выглядеть следующим образом:
The first line
Я искал решение для google, и мне кажется, что я должен использовать sed
. Что-то вроде:
sed 'linenum,$d' file
Но как найти номер строки строки? Или, как еще я должен это делать?
Ответы
Ответ 1
Если вы не хотите печатать согласованную строку (или любые следующие строки):
sed -n '/The second line/q;p' inputfile
Это говорит о том, что "когда вы достигнете линии, которая соответствует шаблону, закройте, иначе распечатайте каждую строку". Параметр -n
предотвращает неявную печать, а для p
требуется явно печатать строки.
или
sed '/The second line/,$d' inputfile
Это говорит: "Удалите все строки из вывода, начинающегося с совпадающей строки, и продолжайте до конца файла".
но первая быстрее.
Если вы хотите напечатать согласованную строку, но не следующие строки:
sed '/The second line/q' inputfile
Это говорит о том, что "распечатать все строки и выйти, когда совпадающая строка достигнута" (опция -n
(без неявной печати) не используется).
Для получения дополнительной информации см. man sed.
Ответ 2
Это немного короче, чем другие данные решения.
Выход из использования капитала Q позволяет избежать печати текущей строки.
sed '/The second line/Q' file
Чтобы фактически удалить строки, вы можете использовать один и тот же синтаксис.
sed -i '/The second line/Q' file
Ответ 3
sed '/The second line/q0' file
Или без gnu sed:
sed '/The second line/q' file
Или, используя grep:
grep -B 9999999 "The second line"
Ответ 4
Использование awk (не отображает согласованную строку)
awk '/pattern/ {exit} {print}' file.txt
Ответ 5
Сначала добавьте номер строки и удалите строку
cat new.txt
The first line
The second line
The third line
The fourth line
cat new.txt | nl
1 The first line
2 The second line
3 The third line
4 The fourth line
cat new.txt | nl | sed "/2/d"
1 The first line
3 The third line
4 The fourth line
cat new.txt | nl |sed "3d;4d"
1 The first line
2 The second line
с помощью awk
awk 'NR!=3 && NR!=4' new.txt
The first line
The second line
Ответ 6
awk '/The second line/{exit}1' file