Después de leer Linux drivers/net/tun.c
y OpenBSD sys/net/if_tun.c
, llegué a la conclusión de que ambos usan colas para los paquetes.
Específicamente, Linux usa una cola dentro del controlador tun/tap y OpenBSD usa la cola de la pila de red preexistente.
No he probado manualmente la funcionalidad de la cola.
$ cat file
Input: Ver=7|errmsg=0=sucess,1=failue
$ awk -F '|' 'BEGIN { OFS=FS } { sub("=", "\"=\"", $2); print }' file
Input: Ver=7|errmsg"="0=sucess,1=failue
Это использует awk
и обрабатывает данные как два|
-поля с разделителями. Вызов sub()
заменяет первое =
во втором поле на "="
. Измененная строка затем печатается.
Чтобы изменить =
после каждого разделителя (, если полей больше двух ), используйте цикл:
awk -F '|' 'BEGIN { OFS=FS } { for (i = 2; i <= NF; ++i) sub("=", "\"=\"", $i); print }' file
Чтобы внести изменения в -место, используя последнюю версию GNUawk
:
awk -i inplace -F '|' 'BEGIN { OFS=FS } { for (i = 2; i <= NF; ++i) sub("=", "\"=\"", $i); print }' file
С не -GNUawk
:
cp file file.tmp
awk -F '|' 'BEGIN { OFS=FS } { for (i = 2; i <= NF; ++i) sub("=", "\"=\"", $i); print }' file.tmp >file
rm file.tmp
Вы можете использовать GNU sed
с включенным механизмом расширенных регулярных выражений:
$ sed -Ee 's/((^|[|])[^|=]*)=/\1"="/g' input.txt