Answers:
以下应该工作:
var="pid: 1234"
var=${var:5}
您确定bash
外壳程序正在执行脚本吗?
即使符合POSIX
var=${var#?????}
最好使用外部过程,尽管这需要您以固定长度模式的形式对5进行硬编码。
${var:5:2}
将从处开始1
并返回12
。
这是一种使用剪切前X个字符的简洁方法cut(1)
。本示例通过剪切从第5个字符开始的子字符串来删除前4个字符。
echo "$pid" | cut -c 5-
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
。花括号用于将字符串与有效的变量字符连接起来,以区分变量是什么和变量不是。如果您想了解更多信息,请查阅“ bash变量字符串连接”以获取更多有关为什么/如何工作的资源。
使用-r
选项(“在脚本中使用扩展的正则表达式”)sed
以使用以下{n}
语法:
$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
sed -r 's/.{5}$//'
改为删除最后5个字符
-r
(-E
在OS X中,IIRC中)(但是不知道在OS X中是否可行)。
-r
/ -E
)在OS X的作品
从字符串中剪切前两个字符:
$ string="1234567890"; echo "${string:2}"
34567890
我在此问题提供的纯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的要求执行此操作,而先前的回答均未解决该问题。)
${string:5}
不起作用,则说明您未使用Bash或其他支持该语法的shell。您使用什么外壳和版本?你的shebang长什么样?我的猜测是您正在使用sh
(例如dash
)或可能使用zsh
。