Как выделить определенное слово?

Все версии bash правильно обрабатывают массивы, если массиву задан список ().
Или элементу массива присваивается значение (даже null ).
Этот код (использует набор текста для запуска в ksh):

unset ar; typeset -a ar=()
printf '%-20s%s ' "$(typeset -p ar)" '--'

unset ar; typeset -a ar; ar[3]=""
printf '%-30s%s ' "$(typeset -p ar)" '@@'

unset ar; typeset -a ar; ar[3]="val"
printf '%-31s ' "$(typeset -p ar)"

Распечатает эти результаты:

zsh/sh          : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
b203sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b204sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b205sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b30sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b32sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b41sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b42sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b43sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b44sh           : declare -a ar=()    -- declare -a ar=([3]="")        @@ declare -a ar=([3]="val")
ksh93           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
attsh           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
zsh/ksh         : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
zsh             : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' )    @@ typeset -a ar=( '' '' val )

Как видите, все оболочки (с некоторыми отличиями )запускают код и дают эквивалентные результаты.


Кроме того,все оболочки работают с этим кодом:

unset ar; typeset -i ar              ; printf '%-17s%s ' "$(typeset -p ar)" '=='
unset ar; typeset -a ar              ; printf '%-19s%s ' "$(typeset -p ar)" '++'

И распечатать:

zsh/sh          : typeset -i ar=0  == typeset -a ar=(  ) ++
b203sh          : declare -i ar="" == declare -a ar='()' ++
b204sh          : declare -i ar="" == declare -a ar='()' ++
b205sh          : declare -i ar="" == declare -a ar='()' ++
b30sh           : declare -i ar="" == declare -a ar='()' ++
b32sh           : declare -i ar="" == declare -a ar='()' ++
b44sh           : declare -i ar    == declare -a ar      ++
ksh93           : typeset -i ar    == typeset -a ar      ++
attsh           : typeset -i ar    == typeset -a ar      ++
zsh/ksh         : typeset -i ar=0  == typeset -a ar=(  ) ++
zsh             : typeset -i ar=0  == typeset -a ar=(  ) ++

Черновой патч есть в bash серии 4. И 4.1, и 4.2 работают с массивом:

b41sh           : declare -a ar='()' ++
b42sh           : declare -a ar='()' ++

Но не для простой переменной. И bash 4.3 не проходит оба теста :

.
b43sh           : script: line 3: typeset: ar: not found ==
                  script: line 4: typeset: ar: not found ++

Итак, для этих тестов отмените Bash 4.3 --.

0
25.01.2017, 15:58
1 ответ

Введите cat (имя вашего текстового файла) | grep (слово, которое вы хотите выделить) , например cat текстовый файл | grep в .

-1
28.01.2020, 05:05

Теги

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