Почему эта замена regex не работает?

Какая модель сервера? А при замене материнской платы вы пытаетесь загрузиться с того же диска? А другие настройки OBP проверены?

Вы исключаете модули / драйверы из / etc / system? Я помню, что драйвер USB (ohci?) Был исключен на старом рабочем столе Solaris 8, из-за чего Xserver не запускался.

Поскольку вы можете войти через rlogin или telnet, что показывает ps -aef | grep X ?

1
10.02.2017, 00:09
3 ответа
sed -E 's/\b([0-9]+\b\s*\b[0-9]+)\b\s*([^\s]+)/\1 "\2"/g' myfile

Это только добавляет двойные кавычки вокруг вашего текста.

Сохраняя цифры и пробелы в группе \ 1 и строку в другой группе (\ 2), sed выводит группу 1 (\ 1), за которой следует пробел, за которым следует двойная кавычка, за которой следует вторая группа (\ 2), за которой следует последняя двойная кавычка.

Вы можете немного сократить это, сгруппировав все цифры и пробелы в одну группу ([0-9,] *) и все после цифр в другой группе (. +) .

Это дает:

sed -E 's/([0-9, ]*)(.+)/\1 "\2"/g' myfile
12 42956     "Cinema - 3D/Multiplex"
7  12560     "Status Update"
5  184    "Movie"
0
27.01.2020, 23:25

Насколько мне известно, \ s - это Perl регулярное выражение, аналогичное [[: blank:]] в sed . Внутри [...] , \ s означает « \ и s ». Также обратите внимание, что даже если [^ \ s] + было бы таким же, как [^ ␣] + , это не соответствовало бы обновлению статуса из-за в пространство посередине.

Замена заменит все совпадения первой группой в двойных кавычках. Вы, вероятно, захотите поймать все три столбца, иначе вы получите только последний столбец. И поскольку вы пытаетесь сопоставить всю строку, вы должны привязать выражение в начале и конце с помощью ^ и $ и сбросить флаг g в конце.

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

$ sed -E 's/[[:alpha:]].+/"&"/' myfile
12 42956    "Cinema - 3D/Multiplex    "
7  12560    "Status Update    "
5  184   "Movie  "

Последний столбец будет найден по тому факту, что его данные всегда начинаются с нецифровой цифры. Выражение будет просто соответствовать оставшейся части строки от первого буквенного символа и заменяет все совпадения версией совпадения в двойных кавычках.

Данные в вопросе имеют пробелы в конце, и кавычки будут включать их. Чтобы избежать пробелов в конце:

$ sed -E -e 's/[[:blank:]]*$//' -e 's/[[:alpha:]].+/"&"/' myfile
12 42956    "Cinema - 3D/Multiplex"
7  12560    "Status Update"
5  184   "Movie"

В качестве альтернативы,

while read -r a b c; do printf '%d\t%d\t"%s"\n' "$a" "$b" "$c"; done <myfile
12      42956   "Cinema - 3D/Multiplex"
7       12560   "Status Update"
5       184     "Movie"
3
27.01.2020, 23:25

Поскольку Mac OSX sedне поддерживает \s. Только GNU sedподдерживает \s.

В Mac OSX \sне работает, даже с цитированием $''ANSI -C.

$ echo $'1\t2 3' | sed 's/\s//g'
1   2 3
$ echo $'1\t2 3' | sed $'s/\s//g'
1   2 3

Вместо этого вы можете использовать[[:space:]]

$ echo $'1\t2 3' | sed 's/[[:space:]]//g'
123

Или вы можете использовать [ \t], но вам понадобятся кавычки $''ANSI -C для символа табуляции.

$ echo $'1\t2 3' | sed $'s/[ \t]//g'
123
0
27.01.2020, 23:25

Теги

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