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

时间:2012-07-13 11:53:37

标签: bash shell sed

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

框中唯一的东西是sed

我正在努力使以下工作:

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

有什么想法吗?

11 个答案:

答案 0 :(得分:168)

以下内容应该有效:

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

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

即使符合POSIX标准

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

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

答案 1 :(得分:75)

这是使用cut(1)剪切前X个字符的简明方法。此示例删除前4个字符。

echo "$pid" | cut -c 4-

答案 2 :(得分:44)

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

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

答案 3 :(得分:17)

这也可以完成这项工作:

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

答案 4 :(得分:8)

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

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

答案 5 :(得分:6)

有可能,你也有cut。如果是这样的话:

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:3)

另一种方法,使用cut代替sed

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

答案 8 :(得分:0)

您可以直接提取数字,而不是从头开始删除n个字符。像这样......

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

这可能是一个更强大的解决方案,而且看起来更直观。

答案 9 :(得分:0)

我在this question提供的纯sed中找到了答案(诚然,在发布此问题之后发布)。这完全符合您的要求,仅在sed中:

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

sed '/./中的点就是您要匹配的内容。您的问题正好是我要尝试的内容,除了在我的情况下,我想匹配文件中的特定行然后取消注释。就我而言,是:

# Uncomment a line:
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

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

(FTR,我发布此答案的目的不是为了获得荣誉,而是因为我想完全按照sed的要求执行此操作,而先前的答案都没有解决该问题的方法。)

答案 10 :(得分:0)

嗯,这里有sedawkcut并使用bash语法的解决方案。我只想抛出另一个POSIX符合变量:

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

-c告诉尾部从输入数据的结尾算起要从哪个字节偏移开始,但是如果数字以+符号开头,则是从输入数据的开头开始到最后。