Есть ли более надежный способ отредактировать совпадающий шаблон, а затем заменить его?

У меня та же проблема, что и у вас, с teemtalk и ssh v7. Я включил все отключенные алгоритмы, шифры и т. д. так же, как и вы, и вижу, что аутентификация по паролю проходит, но затем teemtalk закрывает соединение. Без доступа к журналам teemtalk (это не )или поддержке HP, я наткнулся на ту же кирпичную стену. Единственным вариантом для меня было отказаться от ssh v7 и вернуться к v6, которая работает. Кстати, я работаю над AIX.

6
06.08.2020, 18:02
5 ответов

sedвот идеальный инструмент для этой задачи. Однако обратите внимание, что вам почти никогда не нужно связывать несколько вызовов sedвместе, так как сценарий sedможет состоять из нескольких команд.

Если вы хотите извлечь первую последовательность из 2 десятичных цифр и добавить после пробела до конца строки, если она найдена, вы должны сделать:

sed 's/\([[:digit:]]\{2\}\).*$/& \1/' < your-file

Если вы хотите сделать это, только если он находится на второй позиции в строке и послеa:

sed 's/^a\([[:digit:]]\{2\}\).*$/& \1/' < your-file

И если вы не хотите этого делать, если за этой последовательностью из двух цифр следуют другие цифры:

sed 's/^a\([[:digit:]]\{2\}\)\([^[:digit:]].*\)\{0,1\}$/& \1/' < your-file

С точки зрения устойчивости все сводится к ответу на вопрос:что следует сопоставлять?и чего быть не должно? . Вот почему важно четко указать свои требования, а также понять, как может выглядеть ввод (как могут ли быть цифры в строках, где вы не хотите находить совпадения? , могут ли вводиться не -символы ASCII? , ввод закодирован в кодировке локали? и т. д. ).

Выше, в зависимости от реализации sed, ввод будет декодирован в текст на основе шарма локали (, см. вывод locale charmap), или интерпретирован так, как если бы каждый байт соответствовал символу и байтам от 0 до 127. интерпретируется в соответствии с символом ASCII (при условии, что вы не используете систему на основе EBCDIC ).

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

10
18.03.2021, 23:14

Хотя он и вышел из моды, немногие языки могут сравниться с perl в обработке текста. Например:

  1. Допустим только один набор цифр, скопируйте в конец строки:

     $ perl -pe 's/.*?a(\d+).*/$& $1/' file
     a11.t 11
     some text here
     a06.t 06
     some text here
    
  2. Несколько наборов цифр, добавьте оба в конец

     $ cat file
     a11.t
     some text here
     a06.t
     some text here
     a11.t a54.g
    
     $ perl -pe '@nums=(/a(\d+)/g); s/$/ @nums/' file
     a11.t 11
     some text here 
     a06.t 06
     some text here 
     a11.t a54.g 11 54
    
13
18.03.2021, 23:14

Самый простой способ — следующий:

$ perl -lne '$,=$"; print $_, /a(\d+)/' file
# or this 
$ perl -lpe 's/a(\d+).*\K/ $1/' file
$ awk '
    match($1, /^a[[:digit:]]+/) &&
    gsub(/$/, FS substr($1, RSTART+1, RLENGTH-1)) ||
  1' file

Обратите внимание, что :безопасно использовать substrв части замены gsub, так как мы уже убедились, что это чисто цифровой код.

3
18.03.2021, 23:14

команда

sed 's/\([a-z]\{1,\}\)\([0-9]\{2\}\)\(\..*\)/& \2/g' file

выход

a11.t 11
some text here
a06.t 06
some text here

Питон

#!/usr/bin/python
import re
m=re.compile(r'[0-9]')
k=open('g','r')
for i in k:
    if re.search(m,i):
        print i.strip(),i.split(".")[0][1:]
    else:
        print i.strip()

выход

a11.t 11
some text here
a06.t 06
some text here
0
18.03.2021, 23:14

perlили sed- это то, что нужно, но просто для завершения, повторно -напишите первую версию фрагмента python @PraveeenKumarBS, используя концепцию модуля reсопоставленной «группы»:

#!/usr/bin/python3
import re
pattern = re.compile(r'(\d{2})')
with open('data', 'r') as file:
    for line in file:
        match = re.search(pattern, line)
        if match:
            print(line.rstrip('\n'), match.group(1))
        else:
            print(line.rstrip('\n'))

Если, как кажется, OP подразумевает, что искомый шаблон всегда включает первую букву, просто создайте шаблон:pattern = re.compile(r'[a-zA-Z](\d{2})').

Угол (? )случай более одного совпадения в строке (, как заметил @terdon ), также легко обрабатывается с помощью нового выражения соответствия match = re.finditer(pattern, line)и модифицированной инструкции print.

0
18.03.2021, 23:14

Теги

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