Прочитайте часть имени каталога и избавьтесь от контроля над кареткой usind sed или подобным - PullRequest
2 голосов
/ 16 июня 2011

В каком-то скрипте он читает имя каталога и получает такие вещи, как

66.9090_89.4450_168.0250_ABC3/

Мне нужно извлечь вещь "ABC3", поэтому я пытаюсь

    sed -i -e "s/_/ /g" temp_direc 

так я получаю

66.9090 89.4450 168.0250 ABC3/

, а затем

read LABEL <<< $(awk '{print $4}' temp_direc)

и теперь я получаю

ABC3/

но я не знаю, как убрать окончательный "/". Кроме того, мне нужно позже сделать это

echo $A" "$LABEL

является $ A строкой вроде 45,56

и я хотел бы, чтобы результат был

45.56 ABC3

но я действительно получаю

 ABC3/6

так что, похоже, символ управления кареткой там как-то встроен. Как я мог избавиться от этого и получить желаемый результат?

Ответы [ 6 ]

3 голосов
/ 16 июня 2011

Чистое sed решение будет:

sed 's#.*_\([^_/]*\)\(/\|$\)#\1#'

соотв.с GNU sed:

sed -r 's#.*_([^_/]*)(/|$)#\1#'

Я выбрал # в качестве разделителя (вместо обычного /), потому что в паттерне есть /, который в противном случае пришлось бы экранировать.

2 голосов
/ 16 июня 2011

Попробуйте попроще:

echo '66.9090_89.4450_168.0250_ABC3/' | cut -d"_" -f4 | cut -d"/" -f1

, что дает ABC3

1 голос
/ 16 июня 2011

echo '66 .9090_89.4450_168.0250_ABC3 / ' | sed -e 's /^.*_//' -e 's /.$//'

1 голос
/ 16 июня 2011

Чтобы получить вывод, например, ABC3/6 означает, что ваш $A заканчивается возвратом каретки.Вы можете использовать что-то вроде dos2unix во входном файле или tr, чтобы удалить возврат каретки:

A=$'45.56\r'
B="66.9090_89.4450_168.0250_ABC3/"

a=$( echo "$A" | tr -d $'\r' )   # remove all carriage returns

b=${B##*_}   # remove up to (and including) the last underscore
b=${b%/}     # remove a trailing slash 

echo "$a $b"  # ==> "45.56 ABC3" 
1 голос
/ 16 июня 2011

Решение только для awk:

read LABEL <<< $( echo '66.9090_89.4450_168.0250_ABC3/' \
                  | awk -F '[_/]' '{printf("%s", $4);}' )

Opss ... Я предположил, что поле всегда четвертое, следующая строка не имеет этого ограничения:

read LABEL <<< $( echo '66.9090_89.4450_168.0250_ABC3/' \
                  | awk -F '[_/]' '{printf("%s", $(NF -1));}' ) ; echo $LABEL
1 голос
/ 16 июня 2011

Не на 100% уверен, что вы здесь.Но чтобы получить ABC3, у вас уже есть 90%:

$echo '66.9090_89.4450_168.0250_ABC3/' | awk -F'_' '{print $4;}' | sed 's/\///'
ABC3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...