Я должен удалить строки из файла, которые содержат> 1 слово. Вот пример содержания файла:
This
line is
not
what I need
printed-now.
распечатал бы
This
not
printed-now.
Я использовал бы:
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
Используйте
sed -i '/what I need/c\ ' filename
В основном, это следует, подход -
sed -i '/pattern/c\ line_you_want_to_insert' filename
Здесь line_you_want_to_insert будет пробелом, поскольку Вы хотите удаленный.
С sed
можно использовать это:
sed -i '/\w .*/d' file
или это, если первое слово может содержать что-нибудь кроме пробела:
sed -i '/\S .*/d' file
-i
: измените файл на месте./\w .*/d
: если шаблон /\w .*/
(т.е. слово, пространство и все после этого), подобран, удалите (d
в конце) целая строка./\S .*/d
: если шаблон /\S .*/
(т.е. что-либо кроме пробела, пространства и всего после этого), подобран, удалите (d
в конце) целая строка.У Вас есть много опций сделать то же самое с awk
. Во всех следующих случаях, -i inplace
используется для изменения файла на месте:
Распечатайте только строки, которые не имеют второго поля:
awk -i inplace '!$2' file
Распечатайте только строки, для которых второе поле пусто:
awk -i inplace '$2 == ""' file
Распечатайте только строки для который количество полей (NF
) меньше, чем 2 (равный 1) (благодарит steeldriver!):
awk -i inplace 'NF<2' file
или
awk -i inplace 'NF==1' file
Распечатайте только строки, для которых длина второго поля не является нулем:
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.