【问题标题】:Error on sed script - extra characters after commandsed 脚本出错 - 命令后有多余字符
【发布时间】:2018-09-30 10:39:26
【问题描述】:

我一直在尝试创建一个 sed 脚本,它读取电话号码列表并仅打印符合以下方案的电话号码:

  • +1(212)xxx-xxxx
  • 1(212)xxx-xxxx

我是一个绝对的初学者,但我尝试编写一个 sed 脚本,该脚本将使用-n -r 标志为我打印此内容(其内容如下):

/\+1\(212\)[0-9]{3}-[0-9]{4}/p
/1\(212\)[0-9]{3}-[0-9]{4}/p

如果我直接在 sed 中运行它,它可以正常工作(即 sed -n -r '/\+1\(212\)[0-9]{3}-[0-9]{4}/p' sample.txt 按预期打印匹配的行。这在我编写的 sed 脚本中不起作用,而是 sed 说:

sed: -e 表达式#1, char 2: 命令后的多余字符

我找不到好的解决方案,这个错误似乎有很多原因,我找到的答案都不能在这里轻松应用。

编辑:我用sed -n -r script.sed sample.txt 运行它

【问题讨论】:

  • 脚本的正文贴在上面。 @RedCricket
  • 您没有发布您使用的命令。从文件运行时是否忘记了-f
  • 我没有使用-f,我不知道这是@thatotherguy
  • tip,用于覆盖/\+?1\(212\)[0-9]{3}-[0-9]{4}/p的单个表达式

标签: bash sed


【解决方案1】:

sed 无法自动确定您希望参数是脚本文件还是脚本字符串。

要从文件运行 sed 脚本,您必须使用 -f:

$ echo 's/hello/goodbye/g' > demo.sed

$ echo "hello world" | sed -f demo.sed
goodbye world

如果你忽略了-fsed 将尝试将文件名作为命令运行,而delete 命令不乐意在其后有emo.sed

$ echo "hello world" | sed demo.sed
sed: -e expression #1, char 2: extra characters after command

【讨论】:

  • 完美。这正是我正在寻找的,而且很容易启动。 +1
【解决方案2】:

在各种 unix 工具中,有两个使用 BRE 作为其默认的正则表达式方言。这两个工具是sedgrep

在大多数操作系统中,您可以使用 egrepgrep -E 告诉该工具使用 ERE 作为其方言。较少(但仍然很大)数量的 sed 实现将接受 -E 选项来使用 ERE。

但是,在 BRE 模式下,您仍然可以使用括号创建原子。你通过转义括号来做到这一点。这就是为什么您的初始表达式失败的原因——括号在 BRE 中默认情况下并不特殊,但是您通过在字符前面加上反斜杠来使它们变得特殊。

要记住的另一件事是,如果您希望sed 从命令行参数执行脚本,您应该使用-e 选项。

所以:

$ cat ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx
212-xxx-xxxx

$ grep '^+\{0,1\}1([0-9]\{3\})' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ egrep '^[+]?1\([0-9]{3}\)' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ sed -n -e '/^+\{0,1\}1([0-9]\{3\})/p' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ sed -E -n -e '/^[+]?1\([0-9]{3}\)/p' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

根据您的操作系统,您可以从man re_format 获得有关其工作原理的完整列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多