Обработка переменной bash с помощью sed

переменная bash LATLNG содержит значение широты и долготы в скобках, например:

(53.3096,-6.28396)

  • Повторная команда с разными именами файлов
  • Получение числа неудачных попыток входа в систему заставляет последний успешный вход в систему / CentOS 7
  • Как cygwin, как я могу экспортировать вывод в терминал в файл?
  • Дедупликация расширений брешей Bash
  • Удаление текста из файла с использованием регулярных выражений
  • Легко получить конкретный столбец из вывода без sed или awk
  • Я хочу проанализировать их в переменной LAT и LON, которую я пытаюсь сделать с помощью sed,

    LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG")
    LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG")

    Однако я получаю следующую ошибку:

    sed: can't read (53.3096,-6.28396): No such file or directory

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

  • Как отключить позиционные параметры?
  • Кто запускает процессы командных команд в оболочке?
  • Все файлы в каталоге, которые не заканчиваются в определенной строке?
  • Точная настройка LS_COLORS для суффиксов каталога?
  • Как перенести первые буквы двух слов?
  • Извлечь текст, включая parens
  • 4 Solutions collect form web for “Обработка переменной bash с помощью sed”

    Это можно решить с помощью чистого синтаксиса оболочки. Для этого требуется временная переменная из-за скобок (скобок):

     #!/bin/bash LATLNG="(53.3096,-6.28396)" tmp=${LATLNG//[()]/} LAT=${tmp%,*} LNG=${tmp#*,} 

    Кроме того, вы можете сделать это за один раз, играя с IFS и используя встроенное read :

     #!/bin/bash LATLNG="(53.3096,-6.28396)" IFS='( ,)' read _ LAT LNG _ <<<"$LATLNG" 

    Ответ SiegeX лучше для этого конкретного случая, но вы также должны знать, как передавать произвольный текст в sed .

    sed ожидает, что имена файлов будут вторыми, третьими и т. д. параметрами, и если он не найдет ни одного имени файла, он будет считывать его со стандартного ввода. Поэтому, если у вас есть текст, который вы хотите обработать, это не файл, вам нужно передать его в sed . Самый простой способ:

     echo "blah blah" | sed 's/blah/blam/g' 

    Таким образом, ваш пример станет следующим:

     LAT=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\1/g') LON=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\2/g') 

    Альтернативные (лучше, но более неясные) методы

    Если вы считаете, что существует вероятность, что $LATLNG может начинаться с тире или если вы хотите быть педантичным, вы должны использовать printf вместо echo :

     printf '%s' "$LATLNG" | sed 's/foo/bar/g' 

    Или «здесь документ», но это может быть немного неудобно с конструкцией, которую вы используете:

     LAT=$(sed 's/foo/bar/g' <<END $LATLNG END ) 

    Или, если вы используете bash и не беспокоитесь о переносимости, вы можете использовать «здесь строку»:

     sed 's/foo/bar/g' <<< "$LATLNG" 

    Вот решение, которое будет работать в любой оболочке POSIX:

     parse_coordinates () { IFS='(), ' # Use these characters as word separators set -f # Disable globbing set $1 # Split $1 into separate words set +f # Restore shell state unset IFS LAT=$2 # $1 is the empty word before the open parenthesis LON=$3 } parse_coordinates "$LATLNG" 

    Вот еще одно портативное решение, которое анализирует используемый синтаксис.

     LAT=${LATLNG%\)} # strip final parenthesis LAT=${LAT#\(} # strip initial parenthesis LON=${LAT##*[, ]} # set LON to everything after the last comma or space LAT=${LAT%%[, ]*} # set LAT to everything before the first comma or space 
     LATLNG="(53.3096,-6.28396)" set ${LATLNG//[(,)]/ } LAT=$1 LON=$2 
    Linux и Unix - лучшая ОС в мире.