tag exiftool linux shell sed

linux - exiftool - Reemplazar solo si la cadena existe en la línea actual



shell sed (2)

Solución

Suponiendo que su archivo de entrada $ target contiene lo siguiente:

some text mystring some other text some text mystring a searchstring just some more text

Este comando:

sed -i -e ''/searchstring/ s/mystring/1/ ; /searchstring/! s/mystring/0/'' $target

cambiará su contenido a:

some text 0 some other text some text 1 a searchstring just some more text

Explicación

La secuencia de comandos contiene dos comandos sustituto ( s ) separados por un punto y coma.

El comando sustituto acepta un rango de direcciones opcional que selecciona qué líneas debe tener lugar la sustitución.

En este caso, la dirección de expresión regular se usó para seleccionar líneas que contienen la cadena de búsqueda para el primer comando; y las líneas que no contienen la cadena de búsqueda (observe el signo de exclamación después de la expresión regular que niega la coincidencia) para la segunda.

Editar

Este comando tendrá un mejor rendimiento y producirá el mismo resultado:

sed -i -e ''/searchstring/ s/mystring/1/ ; s/mystring/0/'' $target

El punto es que los comandos se ejecutan secuencialmente y, por lo tanto, si todavía hay una subcadena de mystring en la línea actual después de que finalizó el primer comando, entonces no hay ninguna cadena de búsqueda en ello.

Felicitaciones a usuario946850.

Tengo una línea como:

sed -i ''s/mystring/newstring/'' $target

Este comando cambiará todo el mystring a newstring .

Lo que quiero ahora es: cuando el programa ve mystring , ¿cómo puedo verificar la línea actual si la cadena de searchstring cadenas existe o no? Si existe, newstring es 1 ; de lo contrario, newstring es 0 .


Esto es de la página sed one-liners :

OPTIMIZACIÓN DE LA VELOCIDAD: Si se necesita aumentar la velocidad de ejecución (debido a archivos de entrada grandes o procesadores lentos o discos duros), la sustitución se ejecutará más rápidamente si se especifica la expresión "buscar" antes de dar el "s /.../. ../" instrucción. Así:

sed ''s/foo/bar/g'' filename # standard replace command sed ''/foo/ s/foo/bar/g'' filename # executes more quickly sed ''/foo/ s//bar/g'' filename # shorthand sed syntax

La velocidad no es el problema de la cuestión en cuestión, pero las sugerencias de sintaxis ayudan a formular la solución:

sed -i ''/searchstring/ s/mystring/1/; s/mystring/0/'' $target