заменить длинный текст специальными символами с помощью sed

заменить длинный текст специальными символами с помощью sed

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

sed 's/from/to/g' file.txt

здесь «from» — исходный текст, который заменяется, «to» — заменяемый текст

Я пытаюсь применить это к файлу с длинным текстом со специальными символами, то есть заменить "/D/dec/prog/g++.exe -Wall --std=c++0x" (без кавычек) на "SYSTEM_PATH/BIN", я пробую следующее, но это не работает

sed 's//D/dec/prog/g++.exe   -Wall --std=c++0x/SYSTEM_PATH/BIN/g' file.txt

но это приводит к ошибке «sed: -e выражение № 1, символ 10: неизвестная опция для `s'».

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

1) как определить строку from и to для переменной, что-то вроде FROMSTR = '/D/dec/prog/g++.exe -Wall --std=c++0x' TOSTR = 'SYSTEM_PATH/BIN'

поэтому я могу вызвать sed как sed 's/$FROMSTR/$TO/g' file.txt

но, похоже, sed не знает, как интерпретировать это как переменную

2) после замены текста sed не записывает результат обратно в исходный файл. Как заставить это работать?

решение1

Заменяющая команда ненуждатьсяиспользовать /в качестве разделителя.

sed 's!/D/dec/prog/g++.exe   -Wall --std=c++0x!SYSTEM_PATH/BIN!g' file.txt

решение2

Следуя инструкциям в вопросе: Сначала укажите, что у вас есть и чем это будет заменено:

(base) localhost:~ # FROMSTR='/D/dec/prog/g++.exe -Wall --std=c++0x'
(base) localhost:~ # echo $FROMSTR
/D/dec/prog/g++.exe -Wall --std=c++0x
(base) localhost:~ # TOSTR='SYSTEM_PATH/BIN'
(base) localhost:~ # echo $TOSTR
SYSTEM_PATH/BIN

Затем создал файл для запуска sed.

(base) localhost:~ # cat > testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3

А затем запускаем sed, вызывая переменные, но для первого раза нам нужно использовать echo:

(base) localhost:~ # sed -e "s|`echo $FROMSTR`|$TOSTR|" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2/D/dec/prog/g++.exe -Wall --std=c++0x2
3SYSTEM_PATH/BIN3
(base) localhost:~ # sed -e "s|$FROMSTR|$TOSTR|g" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3

Вот несколько вещей, которые помогут это сделать:

  • Замените разделитель sed с /, к которому мы привыкли, на | или на что-то, что вы не используете ни в одной из двух переменных.
  • Если вы используете одинарные кавычки ', то переменные будут считываться по их именам, а не по их содержимому. $TOSTR будет $TOSTR, а не SYSTEM_PATH/BIN.
  • Используйте двойные кавычки, чтобы иметь возможность интерпретировать переменные.

Если вы хотите, чтобы sed перезаписал файл с выполненной заменой, то вам нужно добавить -i к параметрам sed, но предлагается перенаправить вывод с помощью > в новый файл.

(base) localhost:~ # sed "s|$FROMSTR|$TOSTR|g" testSED > testSEDdone
(base) localhost:~ # cat testSEDdone
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
(base) localhost:~ # cat testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
(base) localhost:~ # sed -i "s|$FROMSTR|$TOSTR|g" testSED
(base) localhost:~ # cat testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3

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