Укоротить очень длинное имя DIR в приглашении Bash

1. Grepping into 1 variable

Попробуйте следующее:

foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")

Это запустит curl 1 раз и grep для вхождений string1 или string2 .

2. Grepping into 2 переменных

Если это разные переменные, немного измените тактику. Захватите вывод curl , а затем grep .

output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")

3. Grepping into the array

Вы также можете сохранить результаты в массиве вместо отдельных переменных.

output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")

С этим немного сложно справиться, если ваши результаты из grep могут не возвращать результаты, поскольку результаты из «string2» могут быть первым или вторым элементом в массиве, но я предоставляю его здесь так же, как демонстрация подхода.

4. Чтение в vars из grep

Еще один метод, который использует команду read вместе с подстановкой процесса ( <(..cmd ..) ).

$ read -d"\n" foo1 foo2 \
   <(curl https://domain.com/file.xml | grep -E "string1|string2")

Это снова может быть сложно, если поиск «строка1» ничего не возвращает, в результате чего любые совпадения для «строка2» отображаются в $ foo1 . Кроме того, этот подход имеет тенденцию быть менее переносимым, чем подход №2 или №3, описанный выше.

0
27.12.2018, 17:59
2 ответа

Вам нужно будет использовать что-то вроде , bash не имеет встроенного метода.

 d='~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one'
# or, d=$(pwd)
e=$( echo "$d" | sed -E 's#([^/]{4})[^/]{13,}([^/.]{3})#\1...\2#g' )
echo "$e"
~/this/is/a-ve...ame/with...ame/and-...one

С другой стороны, вы можете добавить новую строку в приглашение. Я использую что-то вроде этого:

PS1='\u@\h:\w\n\$ '

, что будет выглядеть как

jackman@myhost:~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one
$ _
3
28.01.2020, 02:30

С "расширением параметров" оболочки попробуйте

d='~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one'
IFS=/
for DIR in $d
  do    [ ${#DIR} -gt 8 ] &&    { TMP=${DIR%%${DIR#????}}
                                  DIR=$TMP...${DIR##${DIR%????}}
                                }
        NEW="$NEW${NEW:+/}$DIR"
  done
echo "$NEW"
~/this/is/a-ve...name/with...name/and-...-one

При необходимости сохраните и восстановите IFS. Запуск в подоболочке не будет работать, так как вы хотите получить доступ к переменной NEWпосле этого (, если вы не используете «подстановку команд»... ).

0
28.01.2020, 02:30

Теги

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