Удалить текст между шаблонами, встречающимися в разных строках [дубликат]

Вы можете использовать awk и указать '/' в качестве разделителя:

$ cat data
/dev/shm: 0%used(0MB/4003MB) /var/spool/site/storage/users: 64%used(64437MB/100760MB) /run/user/1001: 0%used(0MB/801MB) /run: 10%used(165MB/1601MB) /run/lock: 0%used(0MB/5MB) /run/user/112: 0%used(0MB/801MB) /sys/fs/cgroup: 0%used(0MB/4003MB) /: 80%used(40518MB/50364MB) (>80%) : WARNING
$ cat data | awk -F' /' '{for(i=1;i<=NF;i++){print $i}}'
/dev/shm: 0%used(0MB/4003MB)
var/spool/site/storage/users: 64%used(64437MB/100760MB)
run/user/1001: 0%used(0MB/801MB)
run: 10%used(165MB/1601MB)
run/lock: 0%used(0MB/5MB)
run/user/112: 0%used(0MB/801MB)
sys/fs/cgroup: 0%used(0MB/4003MB)
: 80%used(40518MB/50364MB) (>80%) : WARNING

См. Это сообщение: https://stackoverflow.com/questions/ 23114583 / bash-script-split-string-using-regex-delimiter

1
08.03.2018, 21:49
4 ответа

Python альтернатива:

python -c 'import sys,re; print(re.sub(r"\([^()]+\)","()",sys.stdin.read().strip()))' <file

Выход:

() () ()

four
0
27.01.2020, 23:32

Использование sedи будет работать, даже если есть вложенные круглые скобки.

sed -z 's/[^()]*)/)/g' infile

Вход:

( (zero) one ) ( two ) (

three

)

((((nested))here)end) last
four

Выход:

( ()) () ()

(((()))) last
four
0
27.01.2020, 23:32

Вы можете использовать perl :для выделения всего ввода в виде одной строки и использовать флаг sв команде s///, чтобы указать, что новые строки следует рассматривать как простые символы:

perl -0777 -pe 's/\(.*?\)/()/sg' <<END
( one ) ( two ) (

three

)

four
END
() () ()

four
2
27.01.2020, 23:32

Эту проблему можно решить с помощью простого конечного автомата на Python.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import fileinput
import sys

active = True
for line in fileinput.input():
    for ch in line:
        if ch == '(':
            sys.stdout.write(ch)
            active = False
        elif ch == ')':
            sys.stdout.write(ch)
            active = True
        elif active:
            sys.stdout.write(ch)

Работающее решение

Использование:

$ echo '( one ) ( two ) (

three

)

four' | python /tmp/statemachine.py

Выход:

() () ()

four
0
27.01.2020, 23:32

Теги

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