Вы, кажется, немного запутались в том, как работает sed, поэтому я пойду шаг за шагом. Мой
"ответ" таков:
с = "столб (3, B, 14)"; эхо $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'
Объяснение
Здесь есть пара проблем. Во-первых, вам нужна точка с запятой после
определение вашей переменной 's', прежде чем повторять ее.
с = "столб (3, B, 14)"; эхо $s
Затем подстановка sed работает с помощью «s/pattern/replacement/», где «pattern» — это
регулярное выражение, а где "замена" - нет. То есть положить что-то
например «[0-9]» в замене не будет представлять никакой цифры, а вместо этого
представляют пять символов: [
, 0
, -
, 9
, и ]
. Так же /г
в
конец означает продолжать применять замену к строке для каждого совпадения
шаблон (поэтому, если бы у вас была линия вроде эхо привет мир | sed 's/o/z/g'
тогда
вывод будет «hellz wzrld». Тогда как эхо привет мир | sed 's/o/z/'
дал бы "адский мир")
Итак, давайте удалим вашу замену на данный момент:
с = "столб (3, B, 14)"; эхо $s | sed 's/col([0-9],[AZ],[0-9])/замена/g'
Обратив внимание на шаблон регулярного выражения, который вы использовали, он говорит:
строка типа 'col(<одна цифра>,<заглавная буква>,<одна цифра>)' - уведомление
что последний [0-9]
часть не будет соответствовать «14», так как это две цифры и т.д.
ваш шаблон будет соответствовать, скажем, «col (3, B, 1)», но не будет соответствовать «col (3, B14)». К
соответствуют одной или нескольким цифрам, вы можете использовать [0-9][0-9]*
:
Чтобы сделать замену так, как вы хотите, лучше всего использовать «захват
группа'. Группы захвата «запоминают» часть совпадения для последующего использования. Вы положили \(
и \)
вокруг той части шаблона, которую вы хотите запомнить и использовать \1
к
обратитесь к нему позже:
с = "столб (3, B, 14)"; эхо $s | sed 's/\(col([0-9],[A-Z],\)/\1replacement/g'
Это будет соответствовать 'col(<одиночная цифра>,<заглавная буква>,' - так что до и
включая точку, где вы хотите добавить «t». Все эти согласованные вещи будут
вернуть взамен(\1
), за которым следует любой текст, который вы добавляете (в этом
случае мы добавляем буквальный текст «замена»). Любой оставшийся текст не
сопоставленные во входных данных не будут затронуты. Выше будет вывод:
столбец(3,B,1замена4)
Итак, если мы теперь поместим 't' в строку замены:
с = "столб (3, B, 14)"; эхо $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'
Мы получили:
столбец(3,B,t14)
Если вы хотите хорошо изучить sed, я могу порекомендовать отличный руководство.