我正在 Linux 上编写一个脚本来根据窗口的位置和方面来管理我的窗口。我用来xwininfo -id ID -all
显示窗口信息,特别是如果最大化并且全屏显示,它会返回类似以下内容的内容:
xwininfo: Window id: 0x2200001 "Newest 'bash' Questions - Unix & Linux Stack Exchange - Google Chrome"
[......]
Window manager hints:
Client accepts input or input focus: Yes
Initial state is Normal State
Displayed on desktop 0
Window type:
Normal
Window state:
Maximized Horz
Maximized Vert
Fullscreen
Focused
Process id: 63354 on host antonio-ThinkPad
Normal window size hints:
Program supplied minimum size: 121 by 127
[.......]
我想提取Window manager hints:
和Normal window size hints
(不包含)之间的所有内容并保存在名为 的变量中,例如 ,$info
而不丢失单独的行。我尝试过awk
,但sed
没有成功。我不是专家程序员,所以提前致谢:)
建议的预期输出:
Client accepts input or input focus: Yes
Initial state is Normal State
Displayed on desktop 0
Window type:
Normal
Window state:
Maximized Horz
Maximized Vert
Fullscreen
Focused
不,它们不会出现在其他地方。
答案1
这将打印两行之间不包括两行的内容:
awk '/Window manager hints:/{flag=1; next} /Normal window size hints/{flag=0} flag' file.txt
输出:
Displayed on desktop 0
Window type:
Normal
Window state:
Maximized Horz
Maximized Vert
[.......]
这将包括两行:
awk '/Window manager hints:/,/Normal window size hints/' file.txt
输出:
Window manager hints:
Displayed on desktop 0
Window type:
Normal
Window state:
Maximized Horz
Maximized Vert
[.......]
上面的命令是针对一个文件运行的,但您也可以通过命令对其进行管道传输:
xwininfo -id ID -all | awk '/Window manager hints:/{flag=1; next} /Normal window size hints/{flag=0} flag'
或者
xwininfo -id ID -all | '/Window manager hints:/,/Normal window size hints/'
答案2
您可以尝试以下操作:
xwininfo -id ID -all | awk -v RS="" '/^ *Window manager hints/{sub(/^[^\n]*\n/,"");print}'
提取相关块。这用于awk
“段落模式”,即每个“空行分隔”块被视为一条记录。然后,您只需检查该记录是否以“窗口管理器提示”开头,前面可能有空格。如果是这样,它会删除第一行并打印记录,这将是您感兴趣的文本块。
为了在 shell 脚本中使用它并将输出导入到 shell 变量中,请将其放置在“命令替换”中,如下所示:
info="$(xwininfo -id ID -all | awk -v RS="" '/^ *Window manager hints/{sub(/^[^\n]*\n/,"");print}')"
由于“正确的变量引用(TM)”,这将保留包括换行符在内的完整结构。