Скрипт Bash для удаления строк, содержащих более одного слова, при сохранении пробелов (alginment) - PullRequest
0 голосов
/ 02 октября 2019

Пример:

[tab] [пробел] Остается

Stays2 [пробел] [tab]

эта строка будет также оставаться

эта строка не останется

Я пытался использовать: sed '/ /d' и: while read a b; do if [ -z "$b" ]

Однако пробелы удаляются и выравнивание не сохраняется. Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Perl для использования более мощных регулярных выражений, чем дает sed:

$ perl -ne 'print if /^\s*\S+\s*$/' input.txt
     Stays
Stays2  
this-line-will-also-stay

Любая строка, которая начинается с 0 или более начальных пробельных символов, 1 или более непробельных символов и 0 или более пробельных символовв конце будет напечатан. Все остальное будет проигнорировано.


Вы можете сделать то же самое в sed, но это немного громоздко из-за основных регулярных выражений:

$ sed -n '/^[[:space:]]*[^[:space:]]\{1,\}[[:space:]]*$/p' input.txt
     Stays
Stays2  
this-line-will-also-stay
0 голосов
/ 02 октября 2019

Вы хотите удалить все строки, где есть как минимум 2 непробельных символа, разделенных 1+ пробельными символами:

sed '/[^[:space:]][[:space:]]\{1,\}[^[:space:]]/d' file

См. онлайн-демонстрацию :

s="  Stays
Stays2  
this-line-will-also-stay
this line will not stay"

sed '/[^[:space:]][[:space:]]\{1,\}[^[:space:]]/d' <<< "$s"

Выход:

     Stays
Stays2  
this-line-will-also-stay
0 голосов
/ 02 октября 2019

Вы хотите соответствовать пробелу, который идет после непробела:

sed '/[^ ] /d'

Или более надежный:

sed '/[^[:space:]][[:space:]]/d'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...