Проблемы с использованием нескольких * в команде grep

Легко сделать с помощью sed

sed 's/\(\([^,]*,\)\{4\}\)\(.*\)/\1\L\3/' file.csv

, если вы не любите переходящие символы, вы можете изменить сценарий (для GNU sed):

sed -r 's/(([^,]*,){4})(.*)/\1\L\3/' file.csv

, которые находят четыре группы любых (0 включенных) символов без запятой, а затем запятую и оставить его без изменений (\1 ) и заменить все в оставшейся части строки (\3 ) на более низкую версию.
Или путем вырезания и вставки

paste -d, <(cut -d, -f-4 file.csv) <(cut -d, -f5- file.csv | tr '[[:upper:]]' '[[:lower:]]')
-121--289533-

Вероятно, вам нужно указать сценарий configure на сценарии конфигурации:

./configure --with-tcltk --with-tcl-config=/usr/lib/tclConfig.sh --with-tk-config=/usr/lib/tkConfig.sh

Они предоставляются соответственно tcl-dev и tk-dev в Debian 8.

-121--289537-

Просто используйте:

cd -P ..

Из bash manpage:

Параметр -P говорит использовать физическую структуру каталогов вместо следующие символьные ссылки.

0
23.05.2018, 06:12
2 ответа

grep usa expresiones regulares , no shell globs .

La expresión regular 0000:00:*.0/usb1/authorized_defaultcoincide con la cadena 0000:00+ cero o más dos puntos + cualquier carácter + 0/usb1/authorized_default.

Si intercambia el *y el ., coincidirá con cualquier cadena que contenga 0000:00seguida de 0/usb1/authorized_default.(.*coincide con cualquier número(*)de cualquier carácter(.).)

Del mismo modo, usb*/coincidirá con us/, usb/, usbbb/, etc., pero no con usb1.


En realidad, también está el problema de que el *sin comillas en el argumento de grepes tomado como un carácter global por el shell , incluso antes de que greplo vea. Entonces, si hay archivos que coincidirían con 0000\:00\:*.0/usb*/authorized_defaultcomo un patrón global, eso afectaría la cadena que va a grep. Múltiples coincidencias irían como múltiples argumentos, y greptomaría las que siguen a la primera como nombres de archivo.

Ponga comillas alrededor de cualquier expresión regular en la línea de comando para evitar eso.


En cualquier caso, ni siquiera necesita el grepaquí, como dice @Kusalananda. La opción -namea findse puede usar para hacer coincidir los nombres de archivo con un patrón global. Al menos algunas implementaciones findtambién tienen la opción -regexpara comparar nombres de archivo con expresiones regulares.


También hay una serie de variantes de expresiones regulares, consulte:¿Por qué mi expresión regular funciona en X pero no en Y?

6
28.01.2020, 02:13

Como ya señaló ilkkachu, grepusa expresiones regulares básicas, lo que significa que :*coincide con cero o más :, y b*coincide con cero o más b.


No grepla salida de find, en su lugar use findpara buscar su archivo. En el caso general, los nombres de archivo pueden contener saltos de línea, lo que haría que grepping no funcionara. Usar findpara filtrar directamente los nombres de ruta que desea ver también es más eficiente y seguro.

find. -type f -name 'authorized_default'

Si tiene que hacer coincidencias en otras partes del nombre de la ruta:

find. -type f -path '*0000:00:*.0/usb*/authorized_default'

-pathfunciona como -namepero hace coincidir un patrón global de nombre de archivo con la ruta completa en lugar de solo con la parte del nombre de archivo de la ruta (, un *puede coincidir con uno o varios/).

Relacionado:

2
28.01.2020, 02:13

Теги

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