如何使用 sed 从字符串中剥离第一个 X 字符?

我正在为嵌入式 Linux 在一个小的工业框内编写 shell 脚本。我有一个包含文本 pid: 1234的变量,我想从行中去掉第一个 X 字符,所以只有1234保留。我有更多的变量,我需要“清理”,所以我需要删除 X 第一个字符和 ${string:5}不工作的某些原因在我的系统。

盒子里只有 sed

我正在努力做到以下几点:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

有什么想法吗?

271006 次浏览

这也将起到作用:

echo "$pid"|awk '{print $2}'

为了使用 {n}语法,对 sed使用 -r选项(“使用脚本中的扩展正则表达式”) :

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

机会是,你也会有 cut。如果是这样:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

以下措施应该奏效:

var="pid: 1234"
var=${var:5}

您确定 bash是执行脚本的 shell 吗?

即使是符合 POSIX 的

var=${var#?????}

将优于使用外部进程,尽管这需要您以固定长度模式的形式硬编码5。

通过 awk '{print substr($0,42)}'传送,其中42比要删除的字符数多一个。例如:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

下面是使用 cut(1)剪切第一个 X 字符的简明方法。此示例通过剪切以第5个字符开头的子字符串来删除前4个字符。

echo "$pid" | cut -c 5-

从字符串中删除前两个字符:

$ string="1234567890"; echo "${string:2}"
34567890

另一种方法是使用 cut而不是 sed

result=`echo $pid | cut -c 5-`

与其从开始删除 n 个字符,不如直接提取数字,就像这样..。

$ echo "pid: 1234" | grep -Po "\d+"

这可能是一个更健壮的解决方案,而且似乎更直观。

我在 这个问题提供的纯 sed 中找到了答案(不可否认,这个问题是在发布之后发布的)。这完全符合您的要求,仅在 sed 中:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

sed '/./中的点是您想匹配的任何内容。您的问题正是我想要解决的问题,只不过在我的例子中,我想要匹配文件中的特定行,然后取消注释。对我来说是:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

sed之后的 -i是在适当的位置编辑文件(如果您想在编辑文件之前测试匹配的表达式,请移除此开关)。

(我发布这篇文章是因为我想完全用 sed 来解决这个问题,而之前的回答都没有解决这个问题。)

这里已经有了 sedawkcut和使用 bash语法的解决方案。我只是想加入另一个 POSIX 符合变体:

$ echo "pid: 1234" | tail -c +6
1234

-c告诉尾部从哪个字节偏移开始,从输入数据的末尾开始计数,但是如果数字以 +符号开始,它就是从输入数据的开始到结束。