148

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

盒子里似乎只有sed.

我正在尝试使以下工作:

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

有任何想法吗?

4

11 回答 11

219

以下应该有效:

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

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

即使是符合 POSIX 的

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

将比使用外部进程更可取,尽管这需要您以固定长度模式的形式对 5 进行硬编码。

于 2012-07-13T12:40:44.810 回答
133

这是使用 . 剪切第一个 X 字符的简洁方法cut(1)。此示例通过剪切从第 5 个字符开始的子字符串来删除前 4 个字符。

echo "$pid" | cut -c 5-
于 2014-12-04T08:09:20.383 回答
48

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

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
于 2012-07-13T12:00:18.540 回答
21

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

$ string="1234567890"; echo "${string:2}"
34567890
于 2015-04-20T14:06:12.400 回答
10

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

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
于 2014-09-12T17:53:09.093 回答
8

很有可能,你也会有cut。如果是这样:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
于 2012-07-13T12:04:46.407 回答
6

好吧,这里有使用sed,awkcutusingbash语法的解决方案。我只想加入另一个符合 POSIX 标准的变体:

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

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

于 2019-04-15T16:38:57.780 回答
4

另一种方式,使用cut代替sed.

result=`echo $pid | cut -c 5-`
于 2017-05-09T13:47:06.363 回答
2

我在这个问题提供的纯 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 来完成这个问题,而之前的回答都没有解决这个问题。)

于 2018-11-01T18:20:05.130 回答
0

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

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

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

于 2018-05-26T00:32:20.573 回答
-7

这也可以完成这项工作:

echo "$pid"|awk '{print $2}'
于 2012-07-13T11:58:52.780 回答