2

У меня есть текстовый файл, который имеет значения, разделенные запятыми. Поле1 имеет поле, которое должно быть сопоставлено, но поле два нуждается в замене на основе совпадения.

Пример:

А, С
ДО НАШЕЙ ЭРЫ

Результат:
ОБЪЯВЛЕНИЕ
ДО НАШЕЙ ЭРЫ

Я предполагаю, что команда будет выглядеть примерно так:

sed 's/A/D/'

Спасибо

2 ответа2

1

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

В выражении вашего адреса ищите «не запятая, а затем то, что вы хотите».

При замене запомните материал перед вашим шаблоном, затем поместите детали "перед" перед строкой замены. Вы помните часть "до", потому что вы хотите, чтобы материал "до" включал только одну запятую, не больше и не меньше. Здесь показано, что оно соответствует первому полю и влияет только на второе; Я заменяю "la" на "moo" во втором столбце строк, которые соответствуют "atter" в первом столбце.

$ echo -e "pattern,blah,aaa\npattern,bleh,stuff" | sed '/[^,]*atter/s/\(^[^,]*,[^,]*\)la/\1moo/g'
pattern,bmooh,aaa
pattern,bleh,stuff

Одно это не будет работать правильно с экранированными запятыми в полях, так что, надеюсь, ваш CSV-файл прост. :)

0

Как насчет этого

$ echo A,fgfdgd|sed -r 's/A,[^,]*/A,D/'
A,D

Если первый столбец - A, а затем запятая, и во втором столбце есть все, что угодно, он заменяет лот на A, D. Это произойдет только тогда, когда оно соответствует A в первом столбце (за которым следует запятая и все во втором столбце).

Пример с файлом

Это превращает ваш пример в ваш результат. Итак, где ваш первый столбец А, ваш второй столбец становится D.

$ cat a.b
A,C
B,C


$ sed -r 's/A,[^,]*/A,D/' a.b
A,D
B,C


$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .