【问题标题】:Bash Script: Delete characters in string up to and including a phrase?Bash Script:删除字符串中的字符,包括一个短语?
【发布时间】:2014-05-04 15:38:07
【问题描述】:

我有一个隐藏 X11 窗口的 bash 脚本。我希望能够找到鼠标所在的窗口并取消映射该窗口。

使用xdotool,我找到了找到窗口ID的方法:

$ xdotool getmouselocation
x:392 y:344 screen:0 window:54799020

我想将此行修剪为仅 54799020
(我想删除直到 window: 并包括在内的所有内容。)

有没有办法做到这一点?我对trsed 的经验很少。我之前用sed 删除了文本,但我还需要删除鼠标坐标,这并不总是相同的。

【问题讨论】:

  • awk 使用字段分隔符 : 并拉出第 4 列
  • 这……相当有趣。虽然从未真正使用过awk。我想我可以阅读手册页并弄清楚。
  • 在大多数情况下,像文件/文本这样解析“记录”会更好地使用 awk——这就是它的设计目的。

标签: bash shell sh xdotool


【解决方案1】:

使用字段分隔符 : 的 awk 并抓取第 4 列

你可以像这样使用 awk 脚本

#!/bin/awk
BEGIN { FS=":";}
print $5

或在命令行上运行它。

awk -F':' '{print $5}' file

在你的情况下

xdotool getmouselocation | awk -F':' '{print $5}' -

将它设置为一个变量(这可能是你正在做的)

WINDOWLOC=`xdotool getmouselocation | awk -F':' '{print $5}' -`

WINDOWLOC=$(xdotool getmouselocation | awk -F':' '{print $5}' -)

【讨论】:

  • 这也可以,但是我在一个 bash 脚本中,真的不想为此制作一个完整的其他文件。不过,它确实有效。 +1
  • @Wyatt8740 您可以将它作为一个独立的单线运行。检查更新。
  • @JS웃 - 我打算在编辑中加入一行,但亚马逊按门铃 - 谢谢
  • 已经将另一个标记为答案 - 抱歉:\ 我不想拿走某人的分数。但我+1ed。谢谢你:)
  • @JS웃 - 你是对的...... awk 是基于 1 而不是基于 0($0 是整行)
【解决方案2】:

对于您的问题标题中的一般情况,这可以通过至少两种方式单独在 bash 中完成。

一个使用bash string manipulation

# ${VARIABLE##pattern} trims the longest match from the start of the variable.
# This assumes that "window:nnnnnn" is the last property returned.

DOTOOL_OUTPUT=$(xdotool getmouselocation)
WINDOW_HANDLE=${DOTOOL_OUTPUT##*window:}

作为助记符,# 在键盘上位于$ 的左侧,并修剪字符串的开头; % 位于 $ 的右侧并修剪字符串的末尾。 #% 修剪最短的模式匹配; ##%% 修剪最长。

另一种方式使用bash regular expression matching

# Within bash's [[ ]] construct, which is a built-in replacement for
# test and [ ], you can use =~ to match regular expressions. Their
# matching groups will be listed in the BASH_REMATCH array.

# Accessing arrays in bash requires braces (i.e. ${ } syntax).

DOTOOL_OUTPUT=$(xdotool getmouselocation)
if [[ $XDOTOOL_OUTPUT =~ window:([0-9]+) ]]; then
  WINDOW_HANDLE=${BASH_REMATCH[1]}
fi

【讨论】:

    【解决方案3】:

    试试这个,

    sed 's/.*window:\(.*\)/\1/g' file  
    

    在你的情况下,

    xdotool getmouselocation | sed 's/.*window:\(.*\)/\1/g'
    

    例子:

    $ echo "x:392 y:344 screen:0 window:54799020" | sed 's/.*window:\(.*\)/\1/g'
    54799020
    

    【讨论】:

    • 谢谢 :) 这很好用。我爱sed! (但我使用了xdotool getmouselocation | sed 's/.*window:\(.*\)/\1/g')。 9分钟内我无法接受这个答案,但我会标记它。在那之前,+1。 (编辑:我看到你将我的命令添加到列表中。)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2023-03-08
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多