0

我正在编写一个简单的脚本,它将获取指向 Evernote 在线笔记的 URL,并将它们转换为evernote:///协议。当我在正则表达式测试器中尝试它时,我正在使用的正则表达式匹配并正确修改了 URL(我正在使用 OS X 的模式)。但是,当我将它与 sed 一起使用时,它只返回原始字符串。

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed 's#https?:_/_/www_.evernote_.com_/shard_/(..)_/nl_/(......)_/(.+_/)#evernote:_/_/_/view_/$2_/$1_/$3$3#'

知道为什么这不起作用吗?谢谢!

[编辑:如果有人感兴趣,这是针对键盘大师宏的 AppleScript 位:

set theURL to the clipboard set ENcode to "echo \"" & theURL & "\" | sed -E 's#https?://www.evernote.com/shard/(..)/nl/(.*)/(.+/)#evernote:///view/\\2/\\1/\\3\\3#' | pbcopy" do shell script ENcode

感谢@DreadPirateShawn 帮助我修复正则表达式。]

4

2 回答 2

0

我想你正在尝试这个:

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed -re 's#https://www.evernote.com/shard/(..)/nl/(......)/(.+)/#evernote://view/\2/\1/\3#'
evernote://view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359

不使用扩展正则表达式:

echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed  's#https://www.evernote.com/shard/\(..\)/nl/\(......\)/\(.\+\)/#evernote://view/\2/\1/\3#'
evernote://view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359
于 2014-07-15T18:18:29.410 回答
0

使用扩展的正则表达式标志-E,删除下划线,并将每个$1模式替换\1为在此处产生一个功能正则表达式:

$ echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed -E 's#https?://www\.evernote\.com/shard/(..)/nl/(......)/(.+/)#evernote:///view/\2/\1/\3\3#'
evernote:///view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359/1875e55a-e512-4cf9-9b18-9e93c6a27359/

(在 Ubuntu 12.04 和 OS X 上确认。)

如果您不使用-E,那么您还需要更改s?[s]?转义分组括号:

$ echo "https://www.evernote.com/shard/s2/nl/227468/1875e55a-e512-4cf9-9b18-9e93c6a27359/" | sed  's#http[s]*://www\.evernote\.com/shard/\(.*\)/nl/\(.*\)/\(.*/\)#evernote:///view/\2/\1/\3\3#'
evernote:///view/227468/s2/1875e55a-e512-4cf9-9b18-9e93c6a27359/1875e55a-e512-4cf9-9b18-9e93c6a27359/

在后一个示例中,我还将每个(....)-type 序列替换为(.*)-- 除非您绝对肯定每个序列的长度(甚至可能如此),否则该(.*)方法将更加灵活一些。

于 2014-07-15T18:14:20.003 回答