Grep и заменить

Grep и заменить

У меня есть файл, в котором есть RESOURCEключевое слово. Оно может встречаться в любом месте файла, например:

[email protected]

Теперь я хочу заменить [email protected]на [email protected]. Мне нужно найти строку, где я могу найти RESOURCEключевое слово, а затем заменить слово после знака равенства. RESOURCEКлючевое слово должно остаться неизмененным.

Может ли кто-нибудь мне помочь в этом вопросе?

вход:

[email protected]

Выход:

[email protected]

решение1

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

Вместо этого можно использовать sedтак:

fromaddr='[email protected]'
toaddr='[email protected]'

sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile

Дано fileкак

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

это создает newfileкак

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

Выражение sedвыберет строки, начинающиеся со строки RESOURCE. Для каждой такой строки оно заменит адрес электронной почты, если он присутствует в строке. Шаблон, используемый для замены, гарантирует, что мы сопоставляем =и что адрес заканчивается в конце строки.

решение2

Команда sedлучше.

sed -i 's/[email protected]/[email protected]/' yourfile

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

sed 's/[email protected]/[email protected]/' yourfile

Это запишет изменения в стандартный вывод, не затрагивая файл.

В любом случае, это даст желаемое изменение:

[email protected]

Если значение RESOURCEв файле отличается и вы хотите изменить его на что-то другое, то:

grep RESOURCE= yourfile

Это вернет строку туда, где она находится, и покажет значение.

Затем вы можете использовать

sed 's/[email protected]/[email protected]/' yourfile

На будущее важно четко указать все это в вашем первоначальном вопросе, чтобы вы могли получить необходимую помощь без всей этой канители.

решение3

Кажется, вы говорите, что хотите заменить строку, которая появляется после =, неважно что этонапример,в данных образца вы хотите заменить [email protected]. Но вы говорите, что независимо от того, какая строка после =, вы хотите заменить ее на [email protected]— по-видимому, вы хотите, чтобы это было жестко закодировано.

Есть несколько вариантов того, как это сделать. Самый простой —

sed 's/RESOURCE=.*/[email protected]/'

которая (как и все команды ниже) использует тот факт, что .*означает «соответствовать всему, что есть». Если вы не хотите вводить RESOURCE=дважды, вы можете сократить вышеприведенное до

sed 's/\(RESOURCE=\).*/\[email protected]/'

где \(\)обозначает часть строки поиска как группу (можно иметь до девяти групп) и \1означает замену на первую группу.

Вышеуказанные команды найдут и заменят RESOURCE= везде, где он появляется в строке. Так, например, ввод

# Lakshminarayana wants to change all occurrences of "RESOURCE=".
[email protected]
[email protected]
[email protected]
FOX RESOURCE=The quick brown fox
# Comment: Originally line 2 said [email protected]

будет изменено на

# Lakshminarayana wants to change all occurrences of "[email protected]
[email protected]
[email protected]
[email protected]
FOX [email protected]
# Comment: Originally line 2 said [email protected]

Если вы хотите найти соответствие только тогда, когда RESOURCE=оно находится в начале строки, используйте^:

sed 's/^RESOURCE=.*/[email protected]/'

или

sed 's/^\(RESOURCE=\).*/\[email protected]/'

Если вы хотите заменить только значение ресурса, а не всю остальную часть строки — например,

[email protected]    [email protected]

к

[email protected]   [email protected]

это тоже можно сделать. Отредактируйте свой вопрос, чтобы сказать именно то, что вы хотите, с полными, понятными объяснениямииПримеры.


Хорошо, выберите один из вариантов выше.sкоманды. Теперь, если вы хотите редактировать файл на месте (как вы указали), сделайте

sed  -i  {s command }  { yourfile }

Если вы хотите создать новый файл, сделайте следующее:

sed  {s command }  { oldfile }  >  { newfile }

На самом деле не печатайте{и}; они там только для разграничения.

Связанный контент