我有一个字符串,我需要插入文件中的特定位置:
该文件包含多个分号(;)我需要在最后一个“;”之前插入字符串
这可能与SED一起使用吗?
请使用命令发布解释,因为我是shell脚本的新手
之前:
adad;sfs;sdfsf;fsdfs
string = jjjjj
后
adad;sfs;sdfsf jjjjj;fsdfs
提前致谢
答案 0 :(得分:2)
这可能对您有用:
echo 'adad;sfs;sdfsf;fsdfs'| sed 's/\(.*\);/\1 jjjjj;/'
adad;sfs;sdfsf jjjjj;fsdfs
\(.*\)
贪婪并吞下整行,;
使正则表达式回溯到最后;
。 \(.*\)
制作了后方引用\1
。将所有内容放在s
命令的RHS中意味着在最后jjjjj
之前插入;
。
答案 1 :(得分:1)
sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/' filename
(用jjjjj
替换你需要插入的内容。)
示例:
$ echo 'adad;sfs;sdfsf;fsdfs;' | sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/'
adad;sfs;sdfsfjjjjj;fsdfs;
说明:
sed
找到以下模式:\([^;]*\)\(;[^;]*;$\)
。转义的圆括号(\(
,\)
)形成了编号组,以便我们稍后可以将其引用为\1
和\2
。
[^;]*
是“;
以外的所有内容,重复多次。
$
表示该行的结尾。
然后将其更改为\1jjjjj\2
。
\1
和\2
是在第一轮和第二轮括号中匹配的组。
答案 2 :(得分:1)
目前,使用sed
:=)
sed -r 's@;([^;]+);$@; jjjjj;\1@' <<< 'adad;sfs;sdfsf;fsdfs;'
/
分隔符可以替换为任何其他字符;
与;
最后一个,$
平均行尾的内容匹配的内容()
修改:POSIX版本(更便携):
echo 'adad;sfs;sdfsf;fsdfs;' | sed 's@;\([^;]\+\);$@; jjjjj;\1@'
答案 3 :(得分:0)
这样的事可能适合你:
echo "adad;sfs;sdfsf;fsdfs"| awk 'BEGIN{FS=OFS=";"} {$(NF-1)=$(NF-1) " jjjjj"; print}'
adad;sfs;sdfsf jjjjj;fsdfs
说明: awk首先将FS(字段分隔符)和OFS(输出字段分隔符)设置为分号;
。 awk中的NF
代表number of fields
。 $(NF-1)
因此意味着最后一个字段。在这个awk命令{$(NF-1)=$(NF-1) " jjjjj"
中,我只是将jjjjj
追加到last-1字段。
答案 4 :(得分:0)
sed -e 's/\(;[^;]*\)$/ jjjj\1/'
在行[^;]*
行末尾的分号后跟任意数量的非分号($
)之前插入jjjj。 \1
被称为反向引用,其中包含\(
和\)
之间匹配的字符。
更新:由于示例输入不再是“;”最后。
答案 5 :(得分:0)
echo 'adad;sfs;sdfsf;fsdfs;' | sed -r 's/(.*);(.*);/\1 jjjj;\2;/'
你不需要否定;因为sed默认是贪婪的,并会选择尽可能多的字符。