Удалить дефис из определенной строки в файле - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть файл данных, в котором должно быть несколько уникальных идентификаторов, лишенных дефисов.

Итак, у меня есть:

(Special_Section "data-values")

, и я хочу получить егозаменено на:

(Special_Section "datavalues")

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

Есть ли в sed или awk способ удалить дефис только из соответствующей части?

В настоящее время я могу сопоставить с: sed -i 's/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/&/g *myfiles* Но я бы хотел запустить s/-// и &, если это возможно.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Вы, похоже, используете GNU sed, поэтому что-то вроде этого может работать:

sed -ri '
  s/(Special_Section [^-]*)-([^)]*)/\1\2/g
  ' <your_filename_glob>
1 голос
/ 16 сентября 2011

это работает?

sed -i '/(Special_Section ".*-.*")/{s/-//}' yourFile
1 голос
/ 16 сентября 2011

Закрыть - отсканировать строки, а затем заменить на те, которые соответствуют:

sed -i '/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/s/\( "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*\)"/\1\2/' *myfiles*

Вы можете разбить это на несколько строк, чтобы избежать полосы прокрутки в SO:

sed -i '/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/{
        s/\( "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*\)"/\1\2/
        }' *myfiles*

И, если подумать, вы также можете сделать:

sed -i 's/\(Special_Section "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*"\)/\1\2/' *myfiles*

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

...