Chỉ nhận hình dạng H + W trên màn hình của tôi mà không có sau + x + y


9

Tôi đang đọc bài viết này . Có một tuyên bố rằng:

ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -s $(xwininfo -root | grep 'geometry' | awk '{print $2;}') -r 25 -i :0.0 -sameq -f mpeg -ar 48000 -s wvga -y sample.mp4 

Khi tôi chạy lệnh, tôi gặp lỗi với phần có nội dung:

xwininfo -root | grep 'geometry' | awk '{print $2;}' 

Lý do là khi bạn sử dụng lệnh này trên máy tính của tôi, nó sẽ xuất ra:

1360x768+0+0 

Làm cách nào để loại bỏ phần cuối của đầu ra độ phân giải màn hình 1360x768thay thế 1360x768+0+0?


1
Nếu bạn biết hình học, 1360x768, chỉ cần sử dụng thay vào đó là một biến
Panther

1
Tôi nhận ra điều này, và đã làm theo cách này thành công. Nhưng tôi đã cố gắng sử dụng kinh nghiệm để tăng kiến ​​thức awk của mình. :)
Guest123ABC

OK chúc may mắn. Có một số hướng dẫn tuyệt vời về awk trên internet.
Panther

Câu trả lời:


10
  • Bạn chỉ có thể sử dụng perlđể nhận độ phân giải:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • Hoặc thậm chí ngắn hơn chỉ với GNU grep:

    xwininfo -root | grep -oP '(?<=geometry )\w+'
    1360x768
    

    Giải thích : Lookbehind (?<=geometry )khẳng định rằng tại vị trí hiện tại trong chuỗi, những gì đứng trước là các ký tự "hình học". Nếu xác nhận thành công, động cơ phù hợp với mẫu độ phân giải.

    Một lookbehind không "tiêu thụ" bất kỳ ký tự nào trên chuỗi. Điều này có nghĩa là sau dấu ngoặc đơn đóng, công cụ regex được đặt ở cùng một vị trí trong chuỗi mà nó bắt đầu tìm kiếm: nó không di chuyển. Từ vị trí đó, sau đó động cơ có thể bắt đầu khớp các ký tự một lần nữa.

    Nguồn: http://www.rexegg.com/regex-disambiginating.html#lookbehind


@ Guest123ABC Tôi đã cập nhật câu trả lời của mình bằng một phiên bản ngắn hơn của biểu thức chính quy
Sylvain Pineau

6

awkCách tiếp cận thuần túy của tôi , chia chuỗi thành các trường dựa trên dấu cách và dấu cộng:

xwininfo -root | awk -F'[+| ]' '/geometry/ {print $4}'

Một phương pháp tương tự như biểu thức Perl của Sylvain nhưng với sed:

xwininfo -root | sed -nr 's/.*geometry ([0-9x]+).*/\1/p'

5

Bạn có thể sử dụng awk substr. Trong trường hợp cụ thể của bạn:

xwininfo -root | awk '/geometry/ {print substr($2,1,8);}'

Hoặc nếu bạn muốn nó hoạt động trong mọi trường hợp:

xwininfo -root | awk '/geometry/ {print $2;}' | cut -d'+' -f1

hy vọng điều này giúp đỡ.


Ồ vâng! Cảm ơn rât nhiều! Người đầu tiên làm việc! :) Cái thứ hai tạo ra hai kết quả: 1 và sau đó là độ phân giải không hoạt động trong trường hợp này, nhưng vẫn là một tuyên bố tuyệt vời cho kiến ​​thức chung.
Guest123ABC

2
bạn nên sử dụng câu trả lời từ sylvain. nó đẹp hơn
Di tích

1
Tôi đã chuyển phần grep vào lệnh awk (vì tôi không thể tự giúp mình). Vấn đề với chất nền là nó sử dụng các vị trí cố định. Các độ phân giải như 1000x1000 sẽ phá vỡ nó vì chúng quá dài.
Oli

@Oli wow di chuyển tốt đẹp. Tôi sẽ không quên về sự thay thế grep đó. Cảm ơn vì những lời khuyên. Bạn hoàn toàn đúng về chất nền, đây là lý do tại sao tôi thêm lệnh thứ hai.
Di tích

2

Những người khác đã cung cấp câu trả lời cho sự vận hành hoàn chỉnh, nhưng chỉ trả lời như thế nào tôi nhận được từ 1360x768+0+0để 1360x768? sau đó tôi sẽ sử dụng cutnhư là giải pháp đơn giản nhất có thể, vd

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$

1

Tôi cũng đã thử các ví dụ chụp màn hình dòng lệnh một vài tuần trước. Là một giải pháp thay thế bạn có thể sử dụng

 xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' 

để phát hiện độ phân giải màn hình.

Để chụp màn hình với âm thanh và micrô bên trong, bạn có thể sử dụng

 avconv -f   pulse -i default -f x11grab -r 15 -s $(xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' ) -i :0.0+0,0 -acodec libmp3lame -vcodec libx264  $(date +"%m%d%Y_%H%M%S_$HOSTNAME")_screencast.mp4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.