【问题标题】:Using sed in a .sh file on Mac OS X在 Mac OS X 上的 .sh 文件中使用 sed
【发布时间】:2012-12-23 04:29:09
【问题描述】:

我正在尝试使用命令行解析一些文本文件。其中一部分涉及在一些格式错误的电子邮件中重新附加损坏的单词。一个例子:

9,650 330,765.0  16.38% NYSE (000) 1,707,915 272,099.0  18.95%     Commodit=
ies Close Change % Change Crude Oil (Feb) 19.62 0.32  1.66% Heating Oil (Ja=

我想抢“商品”。我正在使用这个workaround sed 来完成工作。

我使用的是 Mac OS X 10.7 和 GNU sed 版本 4.2.1。如果在命令行我输入

sed ':a;N;$!ba;s/=\r\n//g' ./filename

sed 工作正常。但是,如果我运行这个 bash 脚本:

#!/bin/bash


sed ':a;N;$!ba;s/=\r\n//g' filename

sed 不起作用。但是,相同的脚本可以在 Ubuntu 的命令行下运行:

9,650 330,765.0  16.38% NYSE (000) 1,707,915 272,099.0  18.95%     Commodities Close Change % Change Crude Oil (Feb) 19.62 0.32  1.66% Heating Oil (Jan)

在我的 Mac 上,更简单的脚本

#!/bin/bash


sed 's/=//g' filename

成功删除所有等号。我正在尝试不同的字符组合来反斜杠,但没有太大成功。 Mac 终端不喜欢什么的任何提示?

【问题讨论】:

  • 示例文件在每行最后一个等号之后包含一个空格。这可能是您的命令失败的原因吗?另外,也许尝试将您的 shebang 更改为 #!/bin/sh 以使其在 OSX 上运行。祝你好运。
  • @steve 谢谢你的建议。不幸的是,将 /bin/bash 更改为 /bin/sh 不起作用。 :( 我更新了示例文件以删除空格,它们不在实际文件中。

标签: macos bash scripting sed terminal


【解决方案1】:

这很可能是 PATH 设置。 /bin/bash 使用默认的$PATH;不知道为什么,但这可能取决于您的正常工作外壳(是那个 bash),或者您的 PATH 设置在哪个点文件中。

OS X 带有它自己的 (BSD) sed,它与 GNU 的不同,因此不起作用。 在脚本中运行sed 命令将选择BSD sed,而不是您自己安装的GNU sed。在脚本中使用 sed 的完整路径,或者之前在脚本中设置 $PATH。显然,您在 Ubuntu 上没有问题,因为默认的 sed 是 GNU。

【讨论】:

  • 好吧,我在我的脚本中使用了 'gsed' 而不是 'sed',这似乎可行。我必须将它安装在 MacPorts 或其他东西上。没错,脚本调用的sed不一样。奇怪的是,当我在脚本中输入echo $PATH 时,我看到的 PATH 与我在命令行中输入相同的命令时得到的相同。
  • 如果您可以从命令行调用sed,但不能从脚本调用,并且您的PATH 是相同的,可能是脚本中无法识别/扩展的别名?
  • 谢谢。我又看了一遍,我的 .bashrc 文件中有别名 sed='gsed'。我尝试按照stackoverflow.com/questions/4477328/… 将其移动到我的 .bash_profile 和 .profile 文件中,但脚本中仍然无法识别我的别名...仍在尝试解决。
  • 别名不会在非交互式 shell(例如您的脚本)中展开。参见例如unix.stackexchange.com/questions/1496/….
猜你喜欢
  • 2012-08-09
  • 2014-03-04
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2013-11-10
  • 2011-01-04
相关资源
最近更新 更多