Вы можете использовать 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
Python
альтернатива:
python -c 'import sys,re; print(re.sub(r"\([^()]+\)","()",sys.stdin.read().strip()))' <file
Выход:
() () ()
four
Использование sed
и будет работать, даже если есть вложенные круглые скобки.
sed -z 's/[^()]*)/)/g' infile
Вход:
( (zero) one ) ( two ) (
three
)
((((nested))here)end) last
four
Выход:
( ()) () ()
(((()))) last
four
Вы можете использовать perl :для выделения всего ввода в виде одной строки и использовать флаг s
в команде s///
, чтобы указать, что новые строки следует рассматривать как простые символы:
perl -0777 -pe 's/\(.*?\)/()/sg' <<END
( one ) ( two ) (
three
)
four
END
() () ()
four
Эту проблему можно решить с помощью простого конечного автомата на 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