Me he encontrado con un problema al intentar escribir un script Bash. Cuando grep
sale, devuelve (generalmente) muchas líneas. Me gustaría agregar un prefijo y un sufijo a cada una de estas líneas de salida.
También me gustaría señalar que estoy ls
entrando grep
, como:
ls | grep
bash
shell-script
grep
SpecialBomb
fuente
fuente
ls
, es un mal juju. Además, ¿tiene que sergrep
? ¿Y puedes dar algún ejemplo de salida?Respuestas:
Con sed:
fuente
sed
siendo un superconjunto degrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
ols | sed -n 's/.*txt.*/prefix&suffix/p'
Con
sed
:Pero tenga en cuenta que esto tiene problemas con los nombres de archivo con saltos de línea y todos los problemas variados de análisis
ls
que generalmente es una mala idea.Con perl
Nota: Perl
grep
puede tomar un patrón, como elgrep
comando, pero también puede hacer cosas como aplicar pruebas de archivo.P.ej
Dentro
grep
del iterador predeterminado$_
se establece el valor del elemento actual, por lo que puede aplicarsed
/grep
regex estilo, o realizar una variedad de tareas basadas en$_
.fuente
“
y simplemente use em.En este caso, GNU le
find
permite hacer todas estas cosas de una vez, eliminando tuberías y el análisis potencialmente problemático dels
:(¡
find
no es una buena forma de modificar arbitrariamente la salida de otros comandos, por supuesto!)Algunas notas:
-maxdepth 1
y-name [^.]*
hacer que la coincidencia de nombres funcione igual que un simplels
(ols .
). Puede usar cualquier globo de estilo shell, pero tenga en cuenta que "*" coincidirá con un "." en un nombre † diferentebash
,[^.]*
significa cualquier cosa que no tenga un ".".*thing.*
lugar de solothing
-name
/ en-regex
lugar de ambos (por ejemplo, -regex "[^.]. MYPATTERN " .-printf
admite muchas cosas ,%n
es el archivo sin nombre o el nombre del directorioComo una alternativa posible sin necesidad de programas externos,
bash
tienecompgen
que, entre otras cosas, expande globos, equivalente a unls
sin opciones:Esto maneja los nombres de archivo con espacios en blanco, incluidas las nuevas líneas.
compgen -G "*"
debería proporcionar el mismo resultado que un planols
(pero tenga en cuenta quels *
es algo completamente diferente). Aún lo necesitarágrep
, y esto puede o no resolver el problema, pero vale la pena mencionarlo.fuente
sed
y lasfind
soluciones son cuestionadas si su prefijo / sufijo incluye caracteres clave regex o si desea pasar una variable de entorno (en lugar de un valor inmediato),xargs
+echo
podría ser más apropiado aquí.Con variable de entorno:
Con una línea:
fuente