Я хочу заменить точное слово с помощью sed

ретрансляция даты может быть сложной, однако как насчет

cd /usr/share/doc

## less that 365 dyas
find . -mtime -365 -type f -name NEWS.gz

## since 1-1-2015
touch -t 201501010000 /tmp/ref
find . -newer /tmp/ref -type f -name NEWS.gz

, вы можете добавить "немного сложности"

touch -t $(date +%Y)01010000 /tmp/ref
-1
08.02.2018, 13:19
2 ответа

Creo que desea agregar un prefijo inicial a su cadena de búsqueda. Si la palabra que intenta reemplazar siempre irá precedida de un espacio:

sed -i 's/ VGHIER_TSV_WB798\./ "VGHIER_TSV_WB798"./g'

De manera más genérica, puede usar la agrupación de expresiones regulares [[:space:]]para cubrir casos de espacios iniciales o tabulaciones, etc. (consulte man isspacepara obtener una lista completa ).

sed -i 's/\([[:space:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

En ese caso, necesitábamos agregar una complejidad adicional al crear una agrupación de expresiones regulares usando los paréntesis escapados y usar una referencia inversa\1para asegurarnos de no perder el carácter exacto al realizar el reemplazo. También hay una clase de expresiones regulares [[:punct:]]para los caracteres de puntuación, en caso de que la palabra esté precedida a veces por uno de ellos. Consulte man isspacepara obtener una lista completa y detallada de lo que cubre cada clase de carácter regex.

Aquí hay una solución de ejemplo más compleja para cubrir el caso de posibles prefijos de puntuación:

sed -i 's/\([[:space:]]\|[[:punct:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

Esto hace uso de la directiva regex|(escapada con una barra invertida parased)para indicar una alternativa.

Finalmente, si la palabra siempre será el primer elemento de la línea, use la expresión regular ^para requerir que:

sed -i 's/^VGHIER_TSV_WB798\./"VGHIER_TSV_WB798"./g'

Y sí, para cualquiera de los anteriores, podría haber "agrupado" y "retrocedido -referenciado" a su cadena:

sed -i 's/^\(VGHIER_TSV_WB798\)\./"\1"./g'
sed -i 's/\([[:space:]]\|[[:punct:]]\)\(VGHIER_TSV_WB798\)\./\1"\2"./g'
1
28.01.2020, 05:07

Si su sedadmite ERE, puede agregar el CBcomo una parte opcional del patrón para que coincida. Esto reemplazaría a ambos:

sed -E 's/(CB)?VGHIER_etc/"\1VGHIER_etc"/g'  test

O, si su sedadmite \<y \>para el inicio y el final de la palabra, use esos:

sed 's/\<VGHIER_etc\>/"VGHIER_etc"/g'  test

Además, tiene un punto final .en el patrón, coincidirá con cualquier carácter y se reemplazará como parte de la cadena. El punto en el reemplazo devolverá un punto literal. s/foo./"foo"./cambia fooda"foo".

2
28.01.2020, 05:07

Теги

Похожие вопросы