0 sed
我需要把它hello123456789
变成567
usingsed
来删除前九个字符和最后两个字符。
我一直在寻找一个命令,只是找不到一个我尝试了几种语言来执行一个函数来执行它但没有运气。
使用 bash 参数扩展:
string=hello123456789
echo ${string:9:-2}
567
Run Code Online (Sandbox Code Playgroud)
sed 's/^.........\(.*\)..$/\1/' file
Run Code Online (Sandbox Code Playgroud)
或者
sed 's/^.\{9\}\(.*\)..$/\1/' file
Run Code Online (Sandbox Code Playgroud)
或者,使用非标准但普遍实现的-E
选项来启用扩展的正则表达式,
sed -E 's/^.{9}(.*)..$/\1/' file
Run Code Online (Sandbox Code Playgroud)
所有这些首先匹配行首的九个字符,然后匹配行中间的任意数量的字符(这些被捕获),最后匹配行尾的两个字符。这里实际上不需要锚定^
和$
,因为表达式的中间部分强制表达式的第一个和最后一个位在行的开始和结束处匹配。整行被中间捕获的字符替换,无论它们可能有多少。
另一种方法sed
:
sed -e 's/.\{9\}//' -e 's/..$//' file
Run Code Online (Sandbox Code Playgroud)
第一个表达式通过用空替换来删除前九个字符,第二个表达式以类似的方式删除最后两个字符。第二个表达式需要用 锚定在行尾$
,但第一个表达式不需要锚定,因为它默认从行的开头匹配。
如果字符串在 shell 变量中var
,那么使用这两个标准变量替换将首先删除字符串的前九个字符,然后是最后两个字符(?
匹配在 shell globbing 模式中使用的任何字符):
sed 's/^.........\(.*\)..$/\1/' file
Run Code Online (Sandbox Code Playgroud)
这模仿了sed
上面的最后一个变体,因为它匹配并删除了字符串开头和结尾的特定数量的字符,而根本不关心字符串的中间部分。
测试这个:
sed 's/^.\{9\}\(.*\)..$/\1/' file
Run Code Online (Sandbox Code Playgroud)