Замена до конца строки в bash - PullRequest
1 голос
/ 16 марта 2010

У меня огромный текстовый файл с множеством строк, таких как:

asdasdasdaasdasd_DATA_3424223423423423
gsgsdgsgs_DATA_6846343636

.....

Я хотел бы сделать для каждой строки подстановку из DATA_ .. до конца, просто с пустым пространством, чтобы я получил:

* +1007 *

.....

Я знаю, что вы можете сделать что-то похожее с:

sed -e "s/^DATA_*$/DATA_/g" filename.txt

но это не работает.

Ты знаешь как?

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 марта 2010

У вас есть две проблемы: вы излишне сопоставляете начало и конец строки с ^ и $, и вы ищете _* (ноль или более подчеркиваний) вместо .* (ноль или больше любого персонажа. Вот что вы хотите:

sed -e 's/_DATA_.*/_DATA_/'

g в конце (глобальный) ничего не сделает, потому что вы уже собираетесь удалить все из первого экземпляра " DATA " и далее - другого не может быть матч.

P.S. -e не является строго необходимым, если у вас есть только одно выражение, но если вы думаете, что можете использовать больше, это удобная привычка.

1 голос
/ 16 марта 2010

с использованием awk. Установите разделитель поля как " DATA ", затем получите поле 1 ($1). Не нужно регулярное выражение

$ awk -F"_DATA_" '{print $1"_DATA_"}' file
asdasdasdaasdasd_DATA_
gsgsdgsgs_DATA_
1 голос
/ 16 марта 2010

С регулярными выражениями * означает предыдущий символ, любое количество раз . Чтобы сопоставить любой символ, используйте .

То, что вы действительно хотите, это .*, что означает любой символ, любое количество раз , например:

sed 's/DATA_.*/DATA_/' filename.txt

Кроме того, я удалил ^, что означает начало строки , так как вы хотите сопоставить «DATA_», даже если это не начало строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...