2013-04-03 5 views
2

Я пытался удалить пустые строки в файл, используя скрипт bash. Теперь, когда я искал в ИНТЕРНЕТЕ, я наткнулся на два варианта. В одном мы можем напрямую изменить исходный файл, а в другом мы можем сохранить его в другом файле. Вот фрагменты кода:

sed -i '/^$/d' fileName.txt 

sed '/^$/d' fileName.txt > newFileName.txt 

Что я не мог понять, как регулярное выражение «/^$/d» можно интерпретировать как пустые строки. Боюсь, я не очень хорош в регулярном выражении. Может кто-нибудь объяснить мне этот?

Также есть ли другой способ сделать это?

+2

'/^$/d' не является регулярным выражением. Это команда 'sed', содержащая регулярное выражение'^$ ' –

+0

Спасибо, много парней за то, что помогли мне здесь. Этот меня долгое время прослушивал. –

ответ

4
/^$/d 


/- start of regex 
^ - start of line 
$ - end of line 
/- end of regex 
d - delete lines which match 

Так в основном найти любую строку, которая является пустой (начальную и конечную точку не являются одинаковыми, например, нет символов), и удалить их.

+0

Отличный ответ. Убрал много сомнений, которые у меня были. Большое спасибо . проголосовали и будут принимать. –

1

/^$/d - команда sed, которая удаляет пустые строки. На самом деле две вещи склеиваются: регулярное выражение /^$/ и инструкция sedd.

Компонент /^$/ - это регулярное выражение, которое соответствует пустой строке. Более конкретно, он ищет начало строки (^), за которой следует непосредственно конец строки ($), то есть пустая строка. Если в строке есть что-то вроде пробела или иначе - этот шаблон не будет соответствовать, так как конец строки не будет непосредственно следовать за началом строки.

Компонент d является инструкцией sed, что означает «удалить». При этом использовании d применяется к любой строке, которая соответствует данному регулярному выражению (/^$/), поэтому она удалит любую пустую строку.

Поскольку sed работает в режиме AUTOPRINT (без переключателя -n), он будет печатать все строки, которые не удаляются - так, в данном случае не совпадает /$^/ - так что команда заканчивает тем, что фильтр который удаляет все пустые строки из ввода.

+1

Эффективный, спасибо, проголосовали. –

+0

Рад, что это было полезно! – sigpwned

0
^ - start of a line 
$ - end of line 

так

/^$/ 

он соответствует линии с строки, начинающейся сразу за концом строки. что означает, пустые строки.

Команда sed с d означает удаление совпадающих строк, то есть удаление пустых строк.

так в основном:

sed '/regex/d(elete)' --this is not a real command line, just for explanation. 
1

/^$/: выберите строки, которые являются пустыми (^ соответствует началу строки, $ соответствует концу строки, и таким образом это соответствует линии, которые начинаются и заканчиваются сразу же без промежуточного содержания).
d: удалить согласованную строку.

0

^$ представляет собой пустую строку, потому что ^ является нулевой шириной анкера что означает начать линии и $ является нулевой шириной анкера что означает конец линии.Таким образом, ^$ должен иметь нулевую ширину (т. Е. Не иметь никаких символов) для соответствия. Там также не может быть никаких символов до ^ на линии или после $ на линии.

1

Давайте начнем с объяснения регулярных выражений:

/^$/d 

^ соответствует началу строки и $ спичек конца строки. поэтому ^$ будет соответствовать пустым строкам.

Вы также используете флаг d с sed. Это приведет к удалению согласованных строк.

и -i выключатель в sed -i '/^$/d' fileName.txt делает sed удаляет линии на месте. Если вы опустите это, он выведет результат в стандартный вывод.

+0

ahh, спасибо за объяснение второго варианта. Поддерживается. –

Смежные вопросы