переменная loong grep выводит ту же входную переменную - PullRequest
0 голосов
/ 11 мая 2019

У меня есть длинная переменная, и я буду искать с помощью grep, когда я использую | grep rc

, а затем вывести bash той же строки, которая равна $ crf

Я хочу, чтобы поиск rc = установитьзначение после = в переменную

crf="cabac=1 / ref=5 / deblock=1:-3:-3 / analyse=0x3:0x113 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.15 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=16 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=19.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00"
rc=$(echo $crf |grep rc=)

вывод совпадает с вводом $ crf

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Всякий раз, когда в моих данных есть пары тегов имя = значение, я считаю, что лучше сначала создать массив имен тегов для значений (f[] ниже), а затем я могу просто получить доступ к значениям по их именам, например:

$ crf='cabac=1 / ref=5 / deblock=1:-3:-3 / analyse=0x3:0x113 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.15 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=16 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=19.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00'

$ echo "$crf" | awk -v tag='rc' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}'
crf

$ echo "$crf" | awk -v tag='ip_ratio' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}'
1.40

$ rc=$(echo "$crf" | awk -v tag='rc' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}')                     $ echo "$rc"
crf
0 голосов
/ 11 мая 2019

Вы не должны использовать grep.Команда grep будет искать в каждой строке совпадения и, если найдет, напечатает эту строку.Так как ваша строка однострочная, она всегда будет печатать всю строку.

Вместо этого вы можете использовать awk, чтобы разделить на rc=, а затем cut, чтобы сохранить только значение:

rc=$(awk -F'rc=' '{ print $2 }' <<< $crf | cut -d' ' -f1)

По частям:

  • awk -F'rc=' '{ print $2 }' <<< $crf разбивает строку crf по разделителю rc= и печатает вторую подстроку.Эта часть начинается со значения, присвоенного rc=
  • | cut -d' ' -f1, она разбивает подстроку выше на пробел () и сохраняет только первый элемент, то есть значение, которое вы ищете.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...