![从文件中删除前九个字符和后两个字符](https://linux22.com/image/191399/%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E5%89%8D%E4%B9%9D%E4%B8%AA%E5%AD%97%E7%AC%A6%E5%92%8C%E5%90%8E%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6.png)
我需要将其转换hello123456789
为567
使用sed
来删除前九个字符和最后两个字符。
我一直在寻找一个命令,只是找不到一个命令,我尝试了几种语言来执行一个函数,但没有运气。
答案1
sed 's/^.........\(.*\)..$/\1/' file
或者
sed 's/^.\{9\}\(.*\)..$/\1/' file
或者,使用非标准但普遍实现的-E
选项来启用扩展正则表达式,
sed -E 's/^.{9}(.*)..$/\1/' file
所有这些首先匹配行开头的九个字符,然后匹配行中间的任意数量的字符(这些字符被捕获),最后匹配末尾的两个字符。这里实际上不需要使用^
and$
进行锚定,因为表达式的中间部分无论如何都会强制表达式的第一位和最后一位在行的开头和结尾处匹配。整行都被中间捕获的字符所取代,无论它们有多少。
另一种方法sed
:
sed -e 's/.\{9\}//' -e 's/..$//' file
第一个表达式通过将前九个字符替换为空来删除前九个字符,第二个表达式以类似的方式删除最后两个字符。第二个表达式需要用 锚定在行尾$
,但第一个表达式不需要锚定,因为它默认从行首匹配。
如果字符串位于 shell 变量中var
,则使用这两个标准变量替换将首先删除字符串的前九个字符,然后删除字符串的最后两个字符(?
在 shell 通配模式中使用时匹配任何字符):
var=${var#?????????}
var=${var%??}
这模仿了上面的最后一个变体sed
,它匹配并删除字符串开头和结尾处的一定数量的字符,而根本不关心字符串的中间部分。
测试这个:
$ var=hello123456789
$ var=${var#?????????}
$ var=${var%??}
$ printf '%s\n' "$var"
567
答案2
使用 bash 参数扩展:
string=hello123456789
echo ${string:9:-2}
567
答案3
为了不遗漏awk
解决方案:
awk -v s=9 -v e=2 '{ print substr($0, s+1, length()-s-e ) }' infile
答案4
另一种(bash
)奇特的方式:
str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"