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


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.