如何使用shell脚本从文件中删除指定长度的字符集。 例如:
文件名:abc.txt
helloshell
现在我如何删除从8到10开头的字符(最后是ell
)?
我在Linux服务器上尝试过sed -r
命令,但它不能在AIX服务器上运行。
Linux命令:
sed -r 's/.(.{3}).*/\1/' filename.txt
答案 0 :(得分:1)
使用Bash(从0到7字符提取子字符串):
str="helloshell"
echo ${str:0:7}
使用sed(从第7位开始删除3个字符):
str="helloshell"
startpos=7;
nbchar=3;
echo "$str" | sed "s/^\(.\{$startpos\}\).\{$nbchar\}\(.*\)/\1\2/"
答案 1 :(得分:0)
如果您总是希望删除最后3个,请尝试此操作。
echo helloshell | sed 's/...$//'
8-10试试这个:
echo helloshell | sed 's/\(.\{7\}\).../\1/'
echo helloshellHowAreYou | sed 's/\(.\{7\}\).../\1/'
对于AIX,您可能需要从\
\{
sed 's/\(.{7}\).../\1/'
如果搜索字符串中存在您想要的模式,则必须调整\(
和\)
答案 2 :(得分:0)
$ sed -r 's/^(.{7}).{0,3}(.*)$/\1\2/g'
helloshell
hellosh
1234567890
1234567
$
{0,3}
确保从第8个位置起3个或更少的字符(0,3表示仅在存在时删除,因此也从第8个位置删除1/2/3个字符)即匹配并删除最小0个字符(对于无字符) )和最多3个字符
如果你只需要从第8个位置删除3个字符,请使用{3}
但是如果少于3个字符,它不会从第8个位置删除字符,例如:
$ sed -r 's/^(.{7}).{3}(.*)$/\1\2/g'
123456789
123456789
$
Edit1:
你可以使用它而不使用-r开关和一些转义:sed 's/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'
如果只执行以BH
开头的行,则可以为替换命令添加限制,如下所示:
sed '/^BH/s/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'
/^BH/s..
将确保仅在以BH
$ sed '/^BH/s/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'
BHhelloshell
BHhelloll
BH123456789
BH123459
helloshell
helloshell
$
要在计算时排除BH
,您可以使用:
$ sed '/^BH/s/^BH\(.\{7\}\).\{0,3\}\(.*\)$/BH\1\2/g'
BHhelloshell
BHhellosh
BH123456789
BH1234567
helloshell
helloshell
$