Я хочу заменить строку, найденную в файле с другой строкой, но у обоих есть специальный символ (в этом примере, это - a .
символ), например, 1.0
и 2.0
таким образом, это является командой, в настоящее время используемой:
sed -i 's/1\.0/2\.0/g' /home/user1/file1.txt
что, если 1.0
и 2.0
были сохранены в переменных $i
и $j
? где i
имеет значение 1.0
и j
имеет значение 2.0
, как я могу все еще замена i
с j
?
Править:
Как muru предложенный, я использовал двойные кавычки, как предложено, и это работает хорошо, только если $i и $j были сохранены как 1,0, и 2.0 я не работаю правильно, если $i и $j, где сохранено как 1,0 и 2.0 кто-либо мог советовать, как зафиксировать это?
EDIT2:
Как muru предложенный, я следовал ответу, найденному здесь, но тем не менее результат не корректен.
Это - мой файл оболочки:
declare -a arr1=("1.0" "2.0" "3.0" "4.0")
ii=1.0
for i in "${arr1[@]}"
do
str2=$i
echo -e "\e[41m## str2 = $str2 ##\e[0m"
echo -e "\e[41m## $ii $str2 ##\e[0m"
printf '%s\n' "$ii" "$str2" |
file=/home/user1/text1.txt
tmpfile="${TMPDIR:-/tmp}/$( basename "$file" ).$$"
while read line
do
echo ${line/$ii/$str2}
done < "$file" > "$tmpfile" && mv "$tmpfile" "$file"
ii=$str2
done
это - мой text1.txt
файл:
0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 1.0 1
и это - результат:
0 0 -4.0
4.0 0 0
0 -4.0 0
1.5 0.0 2.5 1
и корректный результат должен быть:
0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 4.0 1
Используйте жемчуг вместо этого. Это имеет интересное quotemeta
функция в регулярных выражениях, где это обработает специальные символы как .
, *
, и т.д. как простые символы
$ i=1.0 j=4.0
$ perl -pe "s/\Q$i/$j/g" text1.txt
0 0 -1 0
1 0 0 0
0 -1 0 0
1.5 0.0 4.0 1
, Это документируется здесь: http://perldoc.perl.org/functions/quotemeta.html
Извините, я неправильно понял немного... это:
только покрывает замещающую строку.
Для точного соответствия в строке поиска, я не думаю, что sed является Вашим инструментом, Вы хотите ответ, который @muru отправил также: