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