剪切两行之间的字符串

剪切两行之间的字符串

我正在 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)”,这将保留包括换行符在内的完整结构。

相关内容