【问题标题】:Is there a command such as "sed" in Bash scripts in C++?C++ 中的 Bash 脚本中是否有诸如“sed”之类的命令?
【发布时间】:2026-01-02 03:30:02
【问题描述】:

目前,我正在尝试将我的 Bash 脚本转换为 C++ 可执行文件,但我无法使用 sed 命令。

这是我的 Bash 脚本:

unset WIFIMAC
unset BTMAC

# Skip processing if MAC addresses are already written
if [ -f /data/.mac.info -a -f /data/.bt.info ]; then
    echo "MAC addresses already found."
fi

# Wait until Samsung's RIL announces MAC addresses
until [ $(expr length "$WIFIMAC") == 17 ]; do
    WIFIMAC=`getprop ril.wifi_macaddr`
    sleep 1
done

until [ $(expr length "$BTMAC") == 12 ]; do
    BTMAC=`getprop ril.bt_macaddr`
    sleep 1
done

# Set WiFi MAC address
echo $WIFIMAC >/data/.mac.info

# Convert BT MAC address to proper format
echo $BTMAC | sed 's!^M$!!;s!\-!!g;s!\.!!g;s!\(..\)!\1:!g;s!:$!!' >/data/.bt.info

exit

在这里我尝试将其转换为 C++(我将 cmets 放在 Bash 命令旁边):

# This script will read the MAC addresses from Samsung's RIL.

unset WIFIMAC    --->      char wifimac....
unset BTMAC      --->      char btmac...

# Skip processing if MAC addresses are already written
if [ -f /data/.mac.info -a -f /data/.bt.info ]; then    ----> create file_exist(); function with fd = open... and put a smiply if return block
    echo "MAC addresses already found."
fi

# Wait until Samsung's RIL announces MAC addresses
until [ $(expr length "$WIFIMAC") == 17 ]; do           -----> while strlen(wifimac) == 17 blah blah blah....
    WIFIMAC=`getprop ril.wifi_macaddr`              -----> property_get function in cutils.h 
    sleep 1                                         -----> mdelay(1) if ım not wrong huh?.....
done

until [ $(expr length "$BTMAC") == 12 ]; do
    BTMAC=`getprop ril.bt_macaddr`                  -----> SAME COMMANDS ABOVE
    sleep 1
done

# Set WiFi MAC address
echo $WIFIMAC >/data/.mac.info                          -----> create write_string_to_path(); function with write(fd, ...)

# Convert BT MAC address to proper format
echo $BTMAC | sed 's!^M$!!;s!\-!!g;s!\.!!g;s!\(..\)!\1:!g;s!:$!!' >/data/.bt.info -----> ********HERE İS THE COMMAND "sed" *********

exit

我对 sed 有一点了解,但我不知道它在这里做什么,因此我不知道 C++ 中的哪个命令做同样的事情。

【问题讨论】:

  • C++ 有一个正则表达式库。您还需要了解什么?
  • 这种转换完成了什么?似乎 BASH 是适合这项工作的工具。
  • 如果你说明你这样做的原因会有所帮助。如果您只是想制作一个人们无法查看或修改的程序,请搜索shell wrapper programs。如果您有一个主要工作的c++,除了sed,您可以通过调用exec(...) 嵌入您的sed 调用(如果您四处搜索,您会找到一些示例如何执行此操作)。祝你好运。
  • 如果您显示输入格式和所需的输出格式可能会更容易,因为不是每个人都理解sed
  • 在尝试将易碎代码转换为 C++ 代码之前,找出 Bash 脚本无法正常工作的原因可能更明智。 sed 脚本实际上是在做一些基本的字符操作,您可以用 C++ 编写代码,这比在字符串上运行 sed 要方便得多。 IMO,为该任务运行sed 将是荒谬的矫枉过正。

标签: c++ linux bash shell sed


【解决方案1】:

sed 读取其输入(在您的示例中,$BTMAC 中的字符串被回显)并根据传递给它的表达式,用其他内容替换输入数据的某些部分(再次根据表达式)和将结果写入标准输出或输出文件(在您的情况下:/data/.bt.info 文件)

例如:

$ sed 's/replaceThis/WithThis/'

将在其输入数据中将单词replaceThis替换为单词WithThis并输出结果。而以上两个字符串都可以是正则表达式。

如果您不熟悉它,您必须阅读手册以首先了解您的 sed 命令中发生了什么。这里没有人会为你这样做。

现在,在 C++11 中,我们有 regex 库,你可以使用,我猜应该使用。如果你不能使用 C++11 的东西,你应该寻找其他提供正则表达式的库,比如 Qt。

所以在C++11的regex库中,可以使用regex_replace()函数,或者用regex_search()搜索并手动替换。

【讨论】:

  • 比你非常...会尝试一下