У меня есть файл, которые содержат следующие строки.
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
Я хочу удалить все строки, которые содержат следующие шаблоны с помощью команды Sed.
**;**;**;
**;**;**
Пожалуйста, помогите мне. Спасибо.
sed '/\*\*;\*\*;\*\*;\?/d' file
\*\*;\*\*;\*\*;\?
: соответствует **;**;**
строка, дополнительно сопровождаемая ;
символ; d
: удаляет строку. Для редактирования файла на месте:
sed -i '/\*\*;\*\*;\*\*;\?/d' file
% cat file :(
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
% sed '/\*\*;\*\*;\*\*;\?/d' file
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
%
ответ Коса уже делает задание. Мой ответ только улучшает regex несколько.
При помощи группирующегося шаблона \( \)
и завершенное .\+
мы можем сказать этому соответствовать целой группе **;
и независимо от того, что сопровождается. В этом примере я использую
$ sed -e "s|\(\*\*;\).\+|TEST|g" stars.txt
TEST
*(Eng_Sen:This is an apple)TEST
TEST
TEST
*(Eng_Sen:This is an apple)TEST
TEST
Примечание, что версия GNU sed
может взять любой символ в качестве разделителя в команде замены, не всего /
. Здесь я использовал вертикальную панель.
В примере выше, я брал на себя смелость для увеличения примера OP с 3 до 6 строк.
$ cat stars.txt
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
Более в общем, для удаления любой строки, которая только содержит точки с запятой и звездочки:
sed '/^[*;]\+$/d'
, Хотя Вы не должны ограничивать себя sed:
grep -Ev '^[*;]+
Можно использовать Vim в режиме Ex:
ex -sc 'g/\*\*/d' -cx file
g
глобальный поиск
d
удаляет
x
, сохраняют и закрываются