Замените все вхождения двойных кавычек, за исключением случаев, когда за ними стоит запятая или перед ней, с помощью команды sed

Следуя вашей логике, я переделал 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
0
07.12.2016, 03:56
1 ответ

Я предполагаю, что вы также хотите оставить символы кавычек в конце строки нетронутыми (как показано в вашем примере).  Вы можете сделать это с помощью

sed 's/\([^,]\)"\([^,]\)/\1^"\2/g'

Это ищет строки из трех последовательных символов следующим образом:

  1. Символ, отличный от запятой (,),
  2. Двойная кавычка ("), и
  3. Символ, отличный от запятой,

и заменяет их на

  1. Первый символ,
  2. ^", и
  3. Третий символ.

Это не будет работать с несколькими последовательными символами кавычек; например,

…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""
                     ↑                                               ↑   ↑    ↑          ↑
1
28.01.2020, 02:47

Теги

Похожие вопросы