我正在一个小型工业盒子中为嵌入式 Linux 编写 shell 脚本。我有一个包含文本的变量pid: 1234
,我想从该行中删除前 X 个字符,所以只保留 1234 个字符。我有更多需要“清理”的变量,所以我需要删除 X 第一个字符,并且${string:5}
由于某种原因在我的系统中不起作用。
盒子里似乎只有sed
.
我正在尝试使以下工作:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
有任何想法吗?
以下应该有效:
var="pid: 1234"
var=${var:5}
你确定bash
shell正在执行你的脚本吗?
即使是符合 POSIX 的
var=${var#?????}
将比使用外部进程更可取,尽管这需要您以固定长度模式的形式对 5 进行硬编码。
这是使用 . 剪切第一个 X 字符的简洁方法cut(1)
。此示例通过剪切从第 5 个字符开始的子字符串来删除前 4 个字符。
echo "$pid" | cut -c 5-
使用-r
选项(“在脚本中使用扩展的正则表达式”)sed
来使用{n}
语法:
$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
从字符串中剪切前两个字符:
$ string="1234567890"; echo "${string:2}"
34567890
将其通过管道,awk '{print substr($0,42)}'
其中 42 比要删除的字符数多一。例如:
$ echo abcde| awk '{print substr($0,2)}'
bcde
$
很有可能,你也会有cut
。如果是这样:
[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
好吧,这里有使用sed
,awk
和cut
usingbash
语法的解决方案。我只想加入另一个符合 POSIX 标准的变体:
$ echo "pid: 1234" | tail -c +6
1234
-c
告诉tail从哪个字节偏移开始,从输入数据的末尾开始计数,但是如果数字以+
符号开头,则从输入数据的开头到结尾。
另一种方式,使用cut
代替sed
.
result=`echo $pid | cut -c 5-`
我在这个问题提供的纯 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
-i
之后sed
是就地编辑文件(如果要在编辑文件之前测试匹配的表达式,请删除此开关)。
(我发布这个是因为我想完全用 sed 来完成这个问题,而之前的回答都没有解决这个问题。)
而不是从一开始就删除 n 个字符,也许您可以直接提取数字。像这样...
$ echo "pid: 1234" | grep -Po "\d+"
这可能是一个更强大的解决方案,并且看起来更直观。
这也可以完成这项工作:
echo "$pid"|awk '{print $2}'