3

我正在尝试转换从以下内容复制到剪贴板的文本:

+50.8863-114.0157/

像这样:

geo:50.8927777778,-114.013055556,0

我在网上找到了这段代码:

#!/bin/bash
x="geo:"$(xclip -o | tr -d ' ')
notify-send $x -i info
xclip -selection c

但它只是删除了空白。我需要做的是:+xx.xxxx-yy.yyyy/在剪贴板中xy数字 0 - 9

  • 从剪贴板中提取文本作为参数
  • +从头开始剪
  • geo:在开头添加
  • xx.xxxx之后添加geo:(无空格)
  • ,之后添加xx.xxxx(无空格)
  • yy.yyyy之后添加,(无空格)
  • /从末端切开
  • 添加,0到末尾(没有空格)
  • 将结果返回到剪贴板

稍后添加我自己想通了。这是有效的代码:

clipboard_original="$(xclip -o)"
latitude=${clipboard_original:0:8}
longitude=${clipboard_original:8:9}
clipboard_for_digikam_geo=""geo:""${latitude//+}"00000,"${longitude//+}"00000"
echo "$clipboard_for_digikam_geo" | xclip -selection c
exit
4

1 回答 1

2

这个oneliner基本上是你需要的:

xclip -o | sed -rne's/\+?(-?[[:digit:].]+)\+?(-?[[:digit:].]+)\//geo:\1,\2,0/p' | xclip -i

解释:

  • xclip -o将 X 选择输出到标准输出
  • sed <regex>解析您提供的格式(忽略前导+'es)并打印替换文本
    • -rswitch 指示将sed正则表达式解释为扩展正则表达式(ERE)(此处快速介绍),
    • -n抑制(不匹配/不需要的)输入的输出——所以我们必须使用p命令显式打印(sed 脚本中的最后一个字母)
    • -e script定义 sed 脚本:
      • s/regexp/replacement/将匹配regexp输入的每一行(仅第一次出现)并将其替换为replacement(可以包括输入组,如\1)。sed 脚本中的p实际打印替换文本。
      • 正则表达式(简而言之)由两个相同的连续子模式组成:<optional +>(<optional -><one or more digits/dot>). 括号定义了我们在替换中使用的组。
  • xclip -i从标准输入设置 X 选择(sed 的输出)
于 2017-05-16T21:31:36.727 回答