¿Cómo agregar texto después de la enésima aparición en bash?

¿Cómo agregar texto después de la enésima aparición en bash?

Digamos que tengo helloworld.txt:

hello world

Usando sed:

sed 's/w*/goodbye/' helloworld.txt

Me da:

goodbyehello world

Y:

sed 's/$/goodbye/' helloworld.txt

Me da:

hello worldgoodbye

Pero ¿cómo agrego texto?despuésla primera aparición, por lo que se ve así:

hellogoodbye world

Respuesta1

Suponiendo que está hablando de insertar texto antes o después de apariciones específicas depalabrasen una línea de texto.

$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/newword &/'
newword word1 word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/'
word1 newword word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/2'
word1 word2 newword word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/3'
word1 word2 word3 newword word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/4'
word1 word2 word3 word4 newword

Esto inserta la cadena newword(y un espacio anterior) en diferentes ubicaciones de la cadena dada.

La sedexpresion

s/\<[[:alnum:]]\{1,\}\>/& newword/2

sustituirá la segunda coincidencia de una cadena no vacía que consta únicamente de caracteres alfanuméricos.

El flanqueo \<y \>coincide con el límite de ancho cero entre una palabra y una no palabra al inicio y al final de la coincidencia respectivamente (en GNU sed, también puedes usarlo \bpara estos). Esto garantiza que coincida con palabras completas, pero en realidad no es necesario con los datos proporcionados (uso los patrones de límites de palabras porque enfatizan la intención de lo que estoy haciendo).

Es \{1,\}un modificador que está escrito +en una expresión regular extendida y hace que el patrón anterior coincida al menos una vez (pero sedusa expresiones regulares básicas de forma predeterminada).

En la parte de reemplazo, &estará el bit de la cadena de entrada que realmente coincide con el patrón, y al 2final hay una bandera que hace que la sustitución se realice solo para la segunda coincidencia no superpuesta.

Los ejemplosen tu comentario(que es casi lo mismo pero sin insertar el espacio):

$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/'
7DF258FIDUCIAL 01DB-MET-RX PASS
$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/2'
7DF258 01DB-MET-RXFIDUCIAL PASS

Tenga en cuenta que en el ejemplo que dio en los comentarios, las "palabras" también contienen guiones, es por eso que uso [[:alnum:]-]en lugar de solo [[:alnum:]].

información relacionada