2015-02-18 3 views
2

Содержание test.csv является:Sed команду, чтобы заменить строку, которая имеет специальный символ «&»

XYZ,IN123 

Вот мой сценарий:

Var1=IN123 
Var2=A&B 
sed -i "s/$Var1/$Var2/g" test.csv 

Это мой простой код, чтобы заменить содержание test.csv, когда код находит IN123, он будет заменен на & B.

Так ожидаемый результат:

XYZ,A&B 

Но приведенный выше код я получаю:

XYZ,AIN123B 

Что я делаю не так?

ответ

3

К сожалению, вы были пойманы из-за того, что & имеет особое значение в строке замены sed. Это метасимвол, который означает «весь шаблон, который был сопоставлен». Для того, чтобы получить буквальный амперсанд, вы должны избавиться от нее:

Var1='IN123' 
Var2='A\&B' 
sed -i "s/$Var1/$Var2/g" test.csv 

Одиночные кавычки необходимы, чтобы предотвратить \& от интерпретируется как последовательность ускользания в задании. Я добавил их к обеим переменным для симметрии.

+0

Привет, Том, это был образец контента, который я опубликовал. Я на самом деле делаю это из двух входных файлов. Первый файл имеет Var1, Var2, а второй файл - тот же test.csv. Вы имеете в виду во входном файле, я должен справиться с этим? Мне нужно заменить «&» на «\ &»? – Programmer

+0

@JavaProgrammer, если вы хотите использовать sed, тогда да. Однако, учитывая полную информацию о вашей проблеме, похоже, что есть лучшие альтернативы. Вы должны отредактировать свой вопрос, чтобы показать образец ваших файлов и ваш желаемый результат. –

2

Если вы не хотите иметь дело с регулярным выражением и отводящей использования awk как это:

Var1='IN123' 
Var2='A&B' 
awk -v v1="$Var1" -v v2="$Var2" 'BEGIN{FS=OFS=","} $2==v1{$2=v2} 1' test.csv 
XYZ,A&B 
1

& является специальным голец, следовательно, вам нужно использовать \ Переменная2 должно быть указано в этом способ

Var2="A\&B"

+0

Привет, Варган. Это был образец контента, который я опубликовал. Я на самом деле делаю это из двух входных файлов. Первый файл имеет Var1, Var2, а второй файл - тот же test.csv. Вы имеете в виду во входном файле, я должен справиться с этим? Мне нужно заменить «&» на «\ &»? – Programmer

0

Поскольку вопрос спрашивает о том, как это можно сделать с помощью СЭД, существует менее известная особенность об этом, что может быть очень полезно, ч ere - разделители могут быть любыми, что вы хотите, пока они не находятся в вашей заменяющей строке.

Так выше, вы могли бы сделать

sed -i "s|$Var1|$Var2|g" test.csv 

..и может заменить его на $ или: или что-нибудь еще вам нравится.

Смежные вопросы