2015-06-23 2 views
-2

Ниже строка, которую я получаю, теперь я хочу извлечь из этой строки два 3840, какую команду я должен использовать в сценариях Bash?Извлечь нужную информацию из строки в Linux

Stream #0:0(eng): Video: h264 (High) (avc1/0x31637661), yuv420p, 3840x3840 [SAR 1:1 DAR 1:1], 100072 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc

ответ

1

Вы можете направить его в grep grep -oE "[1-9][0-9]*x[1-9][0-9]*", который будет извлекать 3840x3840.

Ниже приведен пример, который извлекает и ширину и высоту в отдельных переменных:

INPUT="Stream #0:0(eng): Video: h264 (High) (avc1/0x31637661), yuv420p, 1024x768 [SAR 1:1 DAR 1:1], 100072 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc" 
RES=`echo $INPUT | grep -oE "[1-9][0-9]*x[1-9][0-9]*"` # 1024x768 
WIDTH=`echo $RES | cut -f1 -dx` # get the first column, where 'x' is the separator 
HEIGHT=`echo $RES | cut -f2 -dx` # get the second column, where 'x' is the separator 
echo $WIDTH # 1024 in this example 
echo $HEIGHT # 768 in this example 
+0

Спасибо, но что, если INPUT у вас здесь, собственно, происходит из .txt-файла? Я попытался прочитать файл в своем скрипте с помощью cat, но он не работает. –

+0

И btw Я попробовал ваше решение, но WIDTH и HEIGHT не равны 1024 и 768 в этом случае, я получил $ RES | cut -f1 -dx и $ RES | cut -f2 -dx вместо этого, что-то не так с кодом? –

+0

Нет кода должен работать, я попробовал его в сценарии оболочки, я только добавил комментарии после этого - я вижу, что для комментария высоты отсутствовало пространство. Если вы хотите, чтобы содержимое файла вы могли сделать 'cat my_file.txt | Grep .... '. В любом случае 'echo $ WIDTH' не должен печатать команду, а результат, так как [обратные ссылки] (http://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-bash) выше выполнить команду. – mfuchs

1

Использование разрезали трубопровода:

newstring=`echo "<your string here>"|cut -f3 -d","` 

Обратите внимание на обратные тики! Ваш NewString должен содержать "3840x3840 [SAR 1: 1 DAR 1: 1]", теперь вы можете сделать еще один разрез и трубопровод:

result=`echo $newstring|cut -f1 -d" "` 

Или все это вместе:

result=`echo "<your string here>"|cut -f3 -d","|cut -f1 -d" "` 

А ты должен теперь иметь «3840x3840». Все это довольно простая команда «вырезать» вместе с трубами - проверьте man-страницу для этих параметров и многое другое для вырезания.

+0

, но если у меня есть эта строка сохраненную в текстовый файл, а затем я могу только сделать эти операции на .txt файл? –

+0

Если он находится в txt-файле, то: result = 'cat | cut -f3 -d", "| cut -f1 -d" "' Portable, работает в системах, которые имеют только csh или ksh, или sh, не просто баш. Использует общие команды * nix, которые будут находиться в любой системе * nix. – TDU

0

Если вы хотите NXM где N = M, вы можете использовать Grep с задней ссылкой.

grep -Eo '([0-9]+)x\1' 
0

Вы можете использовать Баш Реванш

val="Stream #0:0(eng): Video: h264 (High) (avc1/0x31637661), yuv420p, 3840x3840 [SAR 1:1 DAR 1:1], 100072 kb/s, 59.94 fps, 59.94 tbr, 60k tbn 
, 119 .88 tbc" 
[[ $val =~ ([0-9]{4})x([0-9]{4}) ]] 
     echo ${BASH_REMATCH[1]} 
     echo ${BASH_REMATCH[2]} 
Смежные вопросы