Следуя вашей логике, я переделал sed
в немного компактной форме, в которой изменение JAVA _HOME выполняется один раз в начале sed.
Кроме того, есть немного об экранировании переменной java, чтобы ее можно было включить в rhs
команды s///
sed
.
Кроме того, sed
— этоPOSIX
-ly.
java_esc=$(printf '%s\n' "$java" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')
sed -i.BAK -e '
1{
x
s/.*/export JAVA_HOME='"$java_esc"'/
x
}
# assuming the JAVA_HOME declaration does not span line boundaries
/^[[:blank:]]*export[[:blank:]]\{1,\}JAVA_HOME=/{
g
x
s/^/\
/
x
}
${
x
/^\n/!H
x
}
' ~/.bashrc
Я предполагаю, что вы также хотите оставить символы кавычек в конце строки нетронутыми (как показано в вашем примере). Вы можете сделать это с помощью
sed 's/\([^,]\)"\([^,]\)/\1^"\2/g'
Это ищет строки из трех последовательных символов следующим образом:
,
),"
), ии заменяет их на
^"
, иЭто не будет работать с несколькими последовательными символами кавычек; например,
…200,"Purchase at store named "" on Tuesday"
P.S. Знаете ли вы, что ваш пример содержит несбалансированные кавычки?
"Comment on Invoice: "Customer X purchased item Z from store C named "Abc" on "03/04/2016""
↑ ↑ ↑ ↑ ↑