Як видалити всі рядки у файлі, починаючи з відповідного рядка?


84

У мене є файл, який складається з кількох рядків тексту:

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

Але як знайти номер рядка рядка? Або, як інакше мені це робити?


Ваша заява про суперечливість: "Я хочу видалити всі рядки після рядка" означає, що ви видаляєте лише два рядки (як ви говорите), але тоді ваш приклад виводить, що рядок відповідності теж відсутній. Що ти насправді хочеш?
— Джонатан Леффлер,

Відповідний рядок І всі рядки після нього. Я повинен покращити свою англійську. Дякуємо за інформацію!
— DocWiki

Відповіді:


136

Якщо ви не хочете друкувати відповідний рядок (або будь-які наступні рядки):

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
Але деякі команди роздратовуються щодо поламаних труб (наприклад, RCS co -p), і тоді вам краще з цим sed '/The second line/,$d'позначенням.
— Джонатан Леффлер

Ви можете додати пояснення?
— Ахмад Абдельгані,

@AhmadAbdelghany: Додано пояснення.
— Призупинено до подальшого повідомлення.

@DennisWilliamson Велике спасибі.
— Ахмад Абдельгані,

перший метод виводить останній рядок перед відповідним рядком двічі. викреслювання pпісля ;робіт.
— CrazyFrog

27

Це трохи коротше, ніж інші задані рішення. Вихід із використання великої літери Q дозволяє уникнути друку поточного рядка.

 sed '/The second line/Q' file

Для фактичного видалення рядків ви можете використовувати той самий синтаксис.

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

1
Це, безумовно, моє улюблене рішення.
— TryTryAgain

5
sed '/The second line/q0' file

Або без gnu sed:

sed '/The second line/q' file

Або, використовуючи grep:

grep -B 9999999 "The second line"

Велике спасибі! Чи можете ви сказати мені, як я можу знайти номер рядка певного рядка, якого я досі не знаю.
— DocWiki

grep -n файл "Другий рядок" | awk -F: '{print $ 1}'
— Ерік,

@DocWiki: вам не потрібен номер рядка; ви шукаєте це. sed "/$string/,\$d" inputfile.
— Джонатан Леффлер,

5

Використання awk (не відображається відповідна лінія)

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

Це найкраща відповідь, оскільки ви можете не знати значення другого рядка.
— Рон Джон

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.