Обработка переменной удара с sed

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

На работе я выполняю Redhat и OpenSuSE. Мне нравится OpenSuSE немного лучше между двумя, потому что это, кажется, имеет более актуальные пакеты (хотя бесплатная версия Redhat - Fedora - может отличаться).

Дома я запускаю Linux Mint, который является вариантом Ubuntu. Причина я выбрал Mint, состоит в том, потому что все кодеки там прямо из поля, так сказать. Мне нравится он лучше, чем OpenSuSE, потому что Монетный двор намного быстрее, чтобы установить и обновить между двумя. Я также как то, как Монетный двор имеет все программное обеспечение, в котором Вы нуждаетесь в Центре программного обеспечения, включая Chrome, Opera, Skype. В OpenSuSE необходимо найти эти сторонние программы - не огромное соглашение, но хорошо иметь большую часть программного обеспечения, управляемого в одном месте.

Другим большим выбором является Ваша настольная среда. Я не знаю ничего из Единицы Ubuntu, я просто знаком с Gnome и KDE. После выполнения KDE в течение 5 лет я переключился на Gnome. KDE кажется немного более роскошным и является более новейшим, но это, кажется, менее стабильно. Gnome не кажется как симпатичный, но все работает.

16
18.03.2019, 06:04
4 ответа

Это может быть решено через чистый синтаксис оболочки. Это действительно требует временной переменной из-за круглых скобок (скобки) хотя:

#!/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"
18
27.01.2020, 19:48

Ответ 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"
22
27.01.2020, 19:48

Вот решение, которое будет работать в любой оболочке 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
3
27.01.2020, 19:48
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2
-1
27.01.2020, 19:48

Теги

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