как удалить строки с sed, которые содержат больше чем 1 слово

Я должен удалить строки из файла, которые содержат> 1 слово. Вот пример содержания файла:

This
line is
not
what I need
printed-now.

распечатал бы

This
not
printed-now.
1
задан 10 October 2019 в 15:23

3 ответа

Я использовал бы:

sed -E '/\S\s+\S/d' <Data.txt

(т.е., строки, которые содержат что-то, что не является пространством, сопровождаемым никаким количеством пробелов, сопровождаемых чем-то, что не является пространством).

One
Item
Per line
This disappears
This also disappears
This-remains
  Leading-space
Trailing-spaces   

становится:

One
Item
This-remains
  Leading-space
Trailing-spaces   
1
ответ дан 3 December 2019 в 07:19

Используйте

sed -i '/what I need/c\ ' filename

В основном, это следует, подход -

sed -i '/pattern/c\ line_you_want_to_insert' filename    

Здесь line_you_want_to_insert будет пробелом, поскольку Вы хотите удаленный.

0
ответ дан 3 December 2019 в 07:19

С sed можно использовать это:

sed -i '/\w .*/d' file

или это, если первое слово может содержать что-нибудь кроме пробела:

sed -i '/\S .*/d' file
  • -i: измените файл на месте.
  • /\w .*/d: если шаблон /\w .*/ (т.е. слово, пространство и все после этого), подобран, удалите (d в конце) целая строка.
  • /\S .*/d: если шаблон /\S .*/ (т.е. что-либо кроме пробела, пространства и всего после этого), подобран, удалите (d в конце) целая строка.

У Вас есть много опций сделать то же самое с awk. Во всех следующих случаях, -i inplace используется для изменения файла на месте:

  1. Распечатайте только строки, которые не имеют второго поля:

    awk -i inplace '!$2' file
    
  2. Распечатайте только строки, для которых второе поле пусто:

    awk -i inplace '$2 == ""' file
    
  3. Распечатайте только строки для который количество полей (NF) меньше, чем 2 (равный 1) (благодарит steeldriver!):

    awk -i inplace 'NF<2' file
    

    или

    awk -i inplace 'NF==1' file
    
  4. Распечатайте только строки, для которых длина второго поля не является нулем:

    awk -i inplace '!length($2)' file
    

Обратите внимание что -i inplace отметьте работы только для awk версии, больше, чем 4,1. Для версий ниже, чем это, эквивалент должен сначала сохранить в промежуточный файл и затем переименовать этот файл как начальный. Например, первая опция была бы похожа на это:

awk '!$2' file > tmp && mv tmp file

Во всех случаях вывод - это:

This
not
printed-now.
This
not
printed-now.
2
ответ дан 3 December 2019 в 07:19

Другие вопросы по тегам:

Похожие вопросы: