Me he encontrado con un problema al intentar escribir un script Bash. Cuando grepsale, 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 lsentrando 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
sedsiendo 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
lsque generalmente es una mala idea.Con perl
Nota: Perl
greppuede tomar un patrón, como elgrepcomando, pero también puede hacer cosas como aplicar pruebas de archivo.P.ej
Dentro
grepdel iterador predeterminado$_se establece el valor del elemento actual, por lo que puede aplicarsed/grepregex estilo, o realizar una variedad de tareas basadas en$_.fuente
“y simplemente use em.En este caso, GNU le
findpermite hacer todas estas cosas de una vez, eliminando tuberías y el análisis potencialmente problemático dels:(¡
findno es una buena forma de modificar arbitrariamente la salida de otros comandos, por supuesto!)Algunas notas:
-maxdepth 1y-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-regexlugar de ambos (por ejemplo, -regex "[^.]. MYPATTERN " .-printfadmite muchas cosas ,%nes el archivo sin nombre o el nombre del directorioComo una alternativa posible sin necesidad de programas externos,
bashtienecompgenque, entre otras cosas, expande globos, equivalente a unlssin 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
sedy lasfindsoluciones 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+echopodría ser más apropiado aquí.Con variable de entorno:
Con una línea:
fuente