我正在与一位同事讨论从构造函数抛出异常的问题,我想我需要一些反馈。

从设计的角度来看,从构造函数抛出异常是否正确?

假设我在一个类中包装了一个POSIX互斥锁,它看起来像这样:

class Mutex {
public:
  Mutex() {
    if (pthread_mutex_init(&mutex_, 0) != 0) {
      throw MutexInitException();
    }
  }

  ~Mutex() {
    pthread_mutex_destroy(&mutex_);
  }

  void lock() {
    if (pthread_mutex_lock(&mutex_) != 0) {
      throw MutexLockException();
    }
  }

  void unlock() {
    if (pthread_mutex_unlock(&mutex_) != 0) {
      throw MutexUnlockException();
    }
  }

private:
  pthread_mutex_t mutex_;
};

我的问题是,这是标准的方法吗?因为如果pthread mutex_init调用失败,互斥锁对象将不可用,因此抛出异常将确保不会创建互斥锁。

我是否应该为Mutex类创建一个成员函数init,并调用pthread mutex_init,其中将返回基于pthread mutex_init的返回的bool值?这样我就不必为如此低级的对象使用异常了。

假设我有'abbc'字符串,我想替换:

Ab -> BC BC -> ab

如果我尝试两次替换,结果不是我想要的:

echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab

那么我可以像下面这样使用什么sed命令来替换?

echo abbc | sed SED_COMMAND
bcab

编辑: 实际上,文本可以有超过2个模式,我不知道我需要多少替换。因为有一个答案说sed是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。

我有一个用逗号分隔的字符串文件。我正试着用新的一行替换逗号。我试过了:

sed 's/,/\n/g' file

但这并不奏效。我错过了什么?

有没有一种方法告诉sed只输出捕获的组?

例如,给定输入:

This is a sample 123 text and some 987 numbers

和模式:

/([\d]+)/

我能得到只有123和987输出的方式格式化后引用?

下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

在我的bash脚本中,我有一个外部(从用户接收)字符串,我应该在sed模式中使用。

REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"

我如何转义$REPLACE字符串,以便它被sed安全地接受为文字替换?

注意:KEYWORD是一个哑子字符串,没有匹配等。不是用户提供的。

我想保留所有MySQL数据库的备份。我有100多个MySQL数据库。我想同时导出所有这些文件,然后再一次将它们全部导入我的MySQL服务器。我该怎么做呢?

我已经成功地使用下面的sed命令来搜索/替换Linux中的文本:

sed -i 's/old_link/new_link/g' *

然而,当我在Mac OS X上尝试它时,我得到:

“命令c期望\后面跟着文本”

我以为我的Mac运行一个正常的BASH shell。有什么事吗?

编辑:

根据@High Performance的说法,这是因为Mac sed是不同的(BSD)风格,因此我的问题是如何在BSD sed中复制这个命令?

编辑:

下面是一个实际的例子:

sed -i 's/hello/gbye/g' *

我有一个文本文件,其中有一行

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

我需要将上面的整行替换为

This line is removed by the admin.

搜索关键字是text_to_be_replace

我需要为此写一个shell脚本。如何使用sed实现这一点?

我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。

我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?