Как удалить все строки в файле, начиная с совпадающей строки?


87

У меня есть файл, состоящий из нескольких строк текста:

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
Ваша формулировка проблемы противоречива: «Я хочу удалить все строки после строки» означает, что вы удаляете только две строки (как вы говорите), но тогда ваш пример вывода показывает, что строка соответствия также отсутствует. Что вы на самом деле хотите?
Джонатан Леффлер

Соответствующая строка И все строки после нее. Я должен улучшить свой английский. Спасибо за Вашу информацию.
DocWiki 08


Если я не хочу удалять строку, которую ищу, то как это сделать?
byhuang1998

Ответы:


139

Если вы не хотите печатать совпадающую строку (или любые следующие строки):

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 для получения дополнительной информации.


3
Но некоторые команды беспокоятся о сломанных трубах ( co -pнапример, RCS ), и тогда вам лучше использовать sed '/The second line/,$d'нотацию.
Джонатан Леффлер

Не могли бы вы добавить пояснения?
Ахмад Абдельгани

@AhmadAbdelghany: Пояснения добавлены.
Деннис Уильямсон

@DennisWilliamson Большое спасибо.
Ахмад Абдельгани

первый метод распечатывает последнюю строку перед совпадающей строкой дважды. удаление pпосле ;работает.
CrazyFrog

27

Это немного короче, чем другие данные решения. Выйти с заглавной буквы Q позволяет избежать печати текущей строки.

 sed '/The second line/Q' file

Чтобы удалить строки, вы можете использовать тот же синтаксис.

 sed -i '/The second line/Q' file

2
Это, безусловно, мое любимое решение.
TryTryAgain 01

5
sed '/The second line/q0' file

Или без gnu sed:

sed '/The second line/q' file

Или, используя grep:

grep -B 9999999 "The second line"

Большое спасибо! Не могли бы вы сказать мне, как я могу найти номер строки для конкретной строки, которую я до сих пор не знаю.
DocWiki 08

grep -n "Вторая строка" файл | awk -F: '{print $ 1}'
Эрик

@DocWiki: вам не нужен номер строки; вы ищете это. sed "/$string/,\$d" inputfile.
Джонатан Леффлер,

5

Использование awk (не отображается совпадающая строка)

awk '/pattern/ {exit} {print}' file.txt

Это лучший ответ, поскольку вы можете не знать значение второй строки.
RonJohn

0

Сначала добавьте номер строки и удалите строку

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.