Muy nuevo en UNIX pero no nuevo en programación. En la terminal de MacBook. A los efectos de la gestión y búsqueda de listas de palabras para la construcción de crucigramas, estoy tratando de conseguir práctico con el comando grep y sus variaciones. Parece bastante sencillo, pero cuando se quedaba colgado desde el principio con lo que pensé que debería ser un simple caso.
Cuando entro
grep "^COW" masternospaces.txt
Obtengo lo que quiero: una lista de todas las palabras que comienzan con COW.
Pero cuando entro
grep "COW$" masternospaces.txt
Espero obtener una lista de palabras que terminan en VACA (hay muchas de esas palabras), y no se devuelve nada.
El archivo es un archivo de texto sin formato, con cada línea solo una palabra (o una frase de palabra sin espacios) en mayúsculas.
¿Alguna idea de lo que podría estar pasando aquí?
hexdump
para verificar exactamente cómo están formateadas las terminaciones de línea. Le sugiero que use mi formato favorito:hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
. Con la salida, verifique los finales de línea:0a
->LF
,0d
->CR
.Respuestas:
Como mencionó @steeldriver, es probable que el problema sea causado por un estilo de final de línea diferente al
grep
esperado.Para comprobar los finales de línea
Puede usar
hexdump
para verificar exactamente cómo están formateadas las terminaciones de línea. Le sugiero que use mi formato favorito:Con la salida, verifique los finales de línea:
0a
->LF
,0d
->CR
. Un ejemplo muy rápida daría algo como esto:Tenga en cuenta los finales de línea en formato DOS:
0d 0a
.Para cambiar los finales de línea
Se puede ver aquí o aquí para diversos métodos para cambiar los finales de línea utilizando diversas herramientas, pero para una cosa de una sola vez, usted podría utilizar siempre vi / vim:
Grep sin cambiar nada
Si solo desea
grep
coincidir sin importar el final de línea, siempre puede especificar terminaciones de línea como esta:Si se muestra una línea en blanco, puede verificar que realmente coincide con algo mediante la
-v
opción decat
:Mi favorito personal
También puede grep y estandarizar la salida usando
sed
:donde
^M
se obtiene escribiendoCtrl-V Ctrl-M
en su teclado.¡Espero que esto ayude!
fuente
[[:cntrl:]]
@ user43791 sugerido y todavía no coincide con nada para mí. Esto no tiene sentido. Estoy usando GNU grep 2,20 y Análisis de la salida de NDpi que se escribe en un archivo de textocat -v yourfile.ext
, ¿qué ves?file
.Aunque puede usar la sintaxis RegEx 'estándar' con grep (como en la respuesta de @ user43791 ), grep también tiene otros identificadores para indicar los límites de entrada.
Los marcadores para el inicio y el final de toda la línea son
\`
(retroceso) (en lugar de^
) y\'
(apóstrofe) (en lugar de$
).Entonces, para su comando original, usaría:
grep "COW\'" masternospaces.txt
Nota al margen: también es importante tener en cuenta eso
?
y+
se tratará literalmente a menos que escapes de ellos\?
y los\+
conviertas en sus contrapartes selectoras de estilo RegEx.Fuente:
grep
sintaxis de expresiones regularesfuente
Otra forma de eliminar el
\r
antes del grep:Me gusta que esté muy claro ya que no recuerdo cosas como
[[:cntrl:]]
por mucho tiempo.fuente
"COW $" cuando bash estableció el parámetro para grep, se interpretó como 'COW' donde se trata "$" como "", porque $ es un símbolo de escape. cuando $ no se comparó con nada, bash shell lo interpreta como una cadena vacía, por lo que debe usar grep 'COW $' masternospaces.txt en su lugar.
fuente
$
, que se quedaría solo por bash y usada por grep. Compruébelo usted mismo:echo "COW$"
la$
voluntad seguirá allí.En BSD grep tiene que escapar "$" y encerrar la cadena entre comillas dobles:
fuente
$
no será especial para el shell, debido a que el material después de que no es un nombre de variable de shell válida. El uso de comillas simples cadenas estáticas es una mejor idea, pero no hará ninguna diferencia en este caso.