我正在一个小型工业盒中为嵌入式Linux编写shell脚本。我有一个包含文本pid: 1234
的变量,我想从行中删除前X个字符,因此只剩下1234个字符。我有更多需要“清理”的变量,因此我需要删除X个第一个字符,而${string:5}
在我的系统中由于某种原因不起作用。
框中唯一的东西是sed
。
我正在努力使以下工作:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
有什么想法吗?
答案 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)
嗯,这里有sed
,awk
,cut
并使用bash
语法的解决方案。我只想抛出另一个POSIX符合变量:
$ echo "pid: 1234" | tail -c +6
1234
-c
告诉尾部从输入数据的结尾算起要从哪个字节偏移开始,但是如果数字以+
符号开头,则是从输入数据的开头开始到最后。