如何使用sed从字符串中删除前X个字符?

Kok*_*esh 112 bash shell sed

我正在一个小工业盒子里为嵌入式Linux编写shell脚本.我有一个包含文本的变量pid: 1234,我想从行中删除前X个字符,因此只剩下1234个字符.我有更多需要"清理"的变量,因此我需要删除X个第一个字符,${string:5}并且由于某种原因在我的系统中不起作用.

盒子似乎唯一拥有的是sed.

我正在尝试使以下工作:

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

有任何想法吗?

che*_*ner 185

以下应该有效:

var="pid: 1234"
var=${var:5}
Run Code Online (Sandbox Code Playgroud)

你确定bashshell是在执行你的脚本吗?

即使是POSIX兼容的

var=${var#?????}
Run Code Online (Sandbox Code Playgroud)

最好使用外部进程,但这需要您以固定长度模式的形式对5进行硬编码.


Ran*_*Dev 86

这是一个简洁的方法来切割前X个字符cut(1).此示例删除前4个字符.

echo "$pid" | cut -c 4-
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,OP 要求使用 sed,但我觉得这是“如何从字符串中[在终端/bash] 中删除前 X 个字符”的最佳解决方案,当与 git 结合使用时,这很好:`git log --pretty=oneline | 切 -c 42- | 头` (2认同)
  • +1 简单而有用的解决方案.. 当我将 URL 设为 http://<example.com> 并剪切协议“http://”时,我不得不说 8 个字符而不是 7 个字符。我不知道,但这就是我的工作方式。 (2认同)
  • Santosh Kumar Arjunan:那是因为示例“echo "$pid" | cut -c 4-”实际上没有剪切前 4 个字符,而是提取从第 4 个字符开始的子字符串。因此它实际上剪切了前 3 个字符。因此,如果您想剪切前 7 个字符,则需要提取第 8 个字符中的所有内容,因此确实执行“cut -c 8-” (2认同)

Mar*_*air 45

使用-r选项("在脚本中使用扩展正则表达式")sed来使用{n}语法:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Run Code Online (Sandbox Code Playgroud)

  • 如果你逃避括号(不知道是否在OS X中有效),你可以在没有`-r`(OS X,IIRC中的`-E`)的情况下完成. (7认同)
  • @Kokesh:你可以`sed -r's /.{5} $ //'`来删除最后5个字符 (5认同)
  • @Dennis:我刚刚检查过 - 逃避大括号(并且离开`-r` /`-E`)在OS X中工作. (2认同)

小智 11

从字符串中剪切前两个字符:

$ string="1234567890"; echo "${string:2}"
34567890
Run Code Online (Sandbox Code Playgroud)


Arn*_* F. 8

这也可以完成这项工作:

echo "$pid"|awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

  • 该问题是“跳过字符串中的前N个字符”的第一击。您没有回答问题。 (15认同)

Sha*_*hin 8

机会是,你也cut可以.如果是这样:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Run Code Online (Sandbox Code Playgroud)

  • 我之前尝试过CUT,但可能性有限:) (2认同)

Ben*_*Ben 5

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

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Run Code Online (Sandbox Code Playgroud)


Evg*_*eny 5

另一种方式,使用cut而不是sed.

result=`echo $pid | cut -c 5-`
Run Code Online (Sandbox Code Playgroud)


Mec*_*cki 5

那么,有这里已经解决方案sedawkcut以及使用bash的语法。我只想抛出另一个POSIX符合变量:

$ echo "pid: 1234" | tail -c +6
1234
Run Code Online (Sandbox Code Playgroud)

-c告诉尾巴从输入数据的末尾开始计算从哪个字节偏移开始,但是如果数字以+符号开头,则从输入数据的末尾开始。