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