Удаление комментариев из файла данных.В чем различия? - PullRequest
0 голосов
/ 07 декабря 2018

Допустим, вы хотите удалить комментарии из файла данных, используя один из двух методов:

cat file.dat | sed -e "s/\#.*//"
cat file.dat | grep -v "#"

Как работают эти отдельные методы и в чем их различие?Может ли человек также записать чистые данные в новый файл, избегая при этом любых возможных предупреждений или сообщений об ошибках, которые могут попасть в этот файл данных?Если так, как бы вы поступили?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

То, что grep -v потеряет все строки с #, например:

$ cat file
first
# second
thi # rd

, поэтому

$ grep -v "#" file
first

отбросит все строки с # на это не выгодно.Скорее вы должны:

$ grep -o "^[^#]*" file
first
thi 

, как это делает команда sed, но таким образом вы не получите пустых строк.man grep:

   -o, --only-matching
          Print  only  the  matched  (non-empty) parts of a matching line,
          with each such part on a separate output line.
0 голосов
/ 07 декабря 2018

Как работают эти отдельные методы и в чем разница между ними?

Да, они работают одинаково, хотя sed и grep - две разные команды.Ваша команда sed просто заменяет все те строки, которые имеют # на NULL.С другой стороны, grep просто пропустит или проигнорирует те строки, которые пропустят строки, в которых есть #.

Вы можете получить более подробную информацию об этом на man-странице следующим образом:

man grep:

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX.)

man sed:

   s/regexp/replacement/
          Attempt to match regexp against the pattern space.  If successful, replace that portion matched with replacement.   The 

Замена может содержать специальный символ & для ссылки на эту часть шаблонапространство, которое соответствует, и специальное экранирование от \ 1 до \ 9 для ссылки на соответствующие совпадающие подвыражения в регулярном выражении.



Было бы также возможно длячеловек, чтобы записать чистые данные в новый файл, избегая при этом любых возможных предупреждений или сообщений об ошибках в этом файле данных?

да, мы могли бы перенаправить ошибки, используя 2>/dev/nullв обеих командах.

Если да, как бы вы поступили так?

Вы можете попробовать как 2>/dev/null 1>output_file

Объяснение команды sed: Добавление объяснения команды sed тоже сейчас.Это только для целей понимания и не нужно использовать cat, а затем использовать sed, вместо этого вы можете использовать sed -e "s/\#.*//" Input_file.

sed -e "  ##Initiating sed command here with adding the script to the commands to be executed
s/        ##using s for substitution of regexp following it.
\#.*      ##telling sed to match a line if it has # till everything here.
//"       ##If match found for above regexp then substitute it with NULL.
...