Dos artefactos de edición de texto en Unix: awk y sed . Hemos introducido awk antes.
Así que hoy aprende algo de sed.
Sed es la abreviatura de editor de flujo . Sed puede completar tareas muy complejas mediante simples operaciones de comando en la línea de comando y es una herramienta muy poderosa y útil.
Antes de aprender sed, primero creamos el siguiente archivo de texto para los ejercicios de seguimiento: ejemplo.txt
Este es un archivo de prueba. Es el último día de 2018. ¡ Espero todo su éxito! ¡FELIZ AÑO NUEVO!
Uso básico
Uso básico:
sed "s / expresión regular (o carácter específico que se reemplazará) / carácter de destino / bandera" archivo de operación
(Sugerencia: puede deslizar el dedo hacia la izquierda y hacia la derecha)
Si conoce sed, entonces su aplicación más familiar es usar s para reemplazar texto. Por ejemplo, reemplace 2018 en example.txt con 2019.
$ sed "s/2018/2019/" example.txt
This is a test file.
It is the last day of 2019.
Hope all you success!
HAPPY NEW YEAR!
Si desea reemplazar está en exmaple.txt con was:
$ sed "s/is/was/" example.txt
Thwas is a test file.
It was the last day of 2018.
Hope all you success!
HAPPY NEW YEAR!
Es muy extraño que el is en la segunda línea se reemplaza con was, y el is en la primera línea no se reemplaza, pero "this" se reemplaza con "thwas", esto se debe a que en la línea de comando anterior, sed solo reemplaza por defecto El primero "es" en cada línea .
Use & para indicar el carácter a reemplazar
Por ejemplo, en example.txt, ponga todos los números entre paréntesis
$ sed "s/[0-9]/(&)/g" example.txt
This is a test file.
It is the last day of (2)(0)(1)(8).
Hope all you success!
HAPPY NEW YEAR!
Entre ellos, [0-9] es solo una expresión regular, lo que significa los números 0-9, y & significa el contenido que desea reemplazar antes. No sabe qué número es, por lo que puede usar & en su lugar. G significa global , lo que significa no solo Solo reemplaza la primera parte de cada línea que cumple las condiciones, pero reemplaza todos los caracteres que cumplen las condiciones.
Para otro ejemplo, cambie la primera letra de cada palabra a una letra mayúscula:
$ sed "s/ [a-z]/\U&/g" example.txt
This Is A Test File.
It Is The Last Day Of 2018.
Hope All You Success!
HAPPY NEW YEAR
Entre ellos, \ U significa cambiar el elemento coincidente a letras mayúsculas (\ L significa letras minúsculas) , y & significa mantener el patrón después de la transformación.
Utilice \ 1 y \ 2 para representar coincidencias
\ 1 significa el contenido del primer corchete de la expresión regular.
Por ejemplo, en example.txt, desea agregar todos los números entre paréntesis. Usamos el símbolo & para completar la tarea antes, y también puede usar \ 1 para completar esta tarea a continuación.
$ sed "s/\([0-9]\)/(\1)/g" example.txt
This is a test file.
It is the last day of (2)(0)(1)(8).
Hope all you success!
HAPPY NEW YEAR!
Tenga en cuenta que la expresión regular debe estar entre paréntesis, y los paréntesis deben tener el antónimo "\".
Por ejemplo, debemos eliminar todo lo que esté después de la primera letra minúscula en cada línea.
$ sed "s/\([a-z]\).*/\1/" example.txt
Th
It
Ho
HAPPY NEW YEAR!
Para ser más complicado, intercambie la primera letra de la primera palabra en cada línea:
$ sed "s/\(.\)\(\S*\)\(.\) /\3\2\1 /" example.txt
shiT is a test file.
tI is the last day of 2018.
eopH all you success!
YAPPH NEW YEAR!
Donde \ S representa un carácter sin espacio .
Aquí hay un punto importante para recordar: el contenido entre paréntesis en la expresión regular se puede citar en la cadena de destino en la forma de \ 1, \ 2, \ 3 ... (hasta 9).
Área de BANDERA: 1 y 2 indican la posición
Como se mencionó anteriormente, $ sed "s/[0-9]/(&)/g" example.txt
el papel de g es decirle a sed que reemplace todos, no solo el primero que cumpla con las condiciones en cada línea.
Entonces, ¿qué sucede si desea reemplazar solo el segundo que cumple con la condición? Luego, puede usar un número en el área de la bandera para indicar cuál cumple la condición. Como
$ sed 's/[0-9]/(&)/2' example.txt
This is a test file.
It is the last day of 2(0)18.
Hope all you success!
HAPPY NEW YEAR!
El 2 aquí significa encerrar el segundo número de cada línea entre paréntesis.
Área de BANDERA: / p significa generar la línea modificada
El parámetro -n de sed significa que no se emite ningún resultado
$ sed -n 's/[0-9]/(&)/2' example.txt
# 没有输出结果
Si agregamos p al área de la bandera, seremos capaces de generar las líneas modificadas y no se generarán otras líneas. So -n yp se usan a menudo en combinación
$ sed -n 's/[0-9]/(&)/2p' example.txt
It is the last day of 2(0)18.
Área de BANDERA: / w muestra el resultado
Utilice el formato " / w nombre de archivo " y envíe el resultado al archivo tt.txt de la siguiente manera:
$ sed 's/[0-9]/(&)/w tt.txt' example.txt
This is a test file.
It is the last day of (2)018.
Hope all you success!
HAPPY NEW YEAR!
$ cat tt.txt
It is the last day of (2)018.
Tenga en cuenta que la salida aquí es solo la salida de línea procesada, la línea sin procesar no se enviará a tt.txt , por lo que no es lo mismo que la salida usando la redirección ">" !
Área de BANDERA: / I significa ignorar mayúsculas y minúsculas
Como
$ sed 's/t/HHHH/I' example.txt
HHHHhis is a test file.
IHHHH is the last day of 2018.
Hope all you success!
HAPPY NEW YEAR!
Tanto la T mayúscula como la t minúscula han sido reemplazadas por HHHH.
****** Cien lecturas es mejor que una práctica **********
===== EL FIN ====