0

我有一个字符串,我需要在文件中的特定位置插入:

该文件包含多个分号(;)我需要在最后一个“;”之前插入字符串

这可能与 SED 吗?

请务必使用命令发布解释,因为我是 shell 脚本的新手

前 :

adad;sfs;sdfsf;fsdfs

字符串 = jjjjj

adad;sfs;sdfsf jjjjj;fsdfs

提前致谢

4

6 回答 6

3

这可能对您有用:

echo 'adad;sfs;sdfsf;fsdfs'| sed 's/\(.*\);/\1 jjjjj;/'
adad;sfs;sdfsf jjjjj;fsdfs

贪婪并吞下整\(.*\)行,;使正则表达式回溯到最后一个;\(.*\)make sa 反向\1引用。将所有命令放在 RHS 中s意味着jjjjj在最后一个之前插入;

于 2012-05-17T15:49:35.330 回答
1
sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/' filename

(替换jjjjj为您需要插入的内容)。

例子:

$ echo 'adad;sfs;sdfsf;fsdfs;' | sed 's/\([^;]*\)\(;[^;]*;$\)/\1jjjjj\2/'
adad;sfs;sdfsfjjjjj;fsdfs;

解释:

sed找到以下模式:\([^;]*\)\(;[^;]*;$\). 转义的圆括号 ( \(, \)) 形成编号组,因此我们稍后可以将它们称为\1and \2

[^;]*是“除了 之外的一切;,重复任意次数。

$表示行尾。

然后将其更改为\1jjjjj\2.

\1并且\2是在第一和第二圆括号中匹配的组。

于 2012-05-17T13:39:25.067 回答
1

sed目前,使用: =)的较短解决方案

sed -r 's@;([^;]+);$@; jjjjj;\1@' <<< 'adad;sfs;sdfsf;fsdfs;'
  • -r 选项代表扩展的正则表达式
  • @ 是分隔符,已知的/分隔符可以替换为任何其他字符
  • ;我们用任何不是;最后的东西来匹配正在完成的东西,$意思是行尾
  • 我解释的最后一部分是用()
  • 最后,我们通过添加“; jjjj”来替换匹配部分,并将其与捕获的部分连接起来

编辑:POSIX 版本(更便携):

echo 'adad;sfs;sdfsf;fsdfs;' | sed 's@;\([^;]\+\);$@; jjjjj;\1@'
于 2012-05-17T13:40:51.257 回答
0

这样的事情可能对你有用:

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 字段。

于 2012-05-17T13:32:23.030 回答
0
sed -e 's/\(;[^;]*\)$/ jjjj\1/'

在分号后跟任意数量的非分号 ( [^;]*)的部分之前插入 jjjj $\1称为反向引用\(,包含在和之间匹配的字符\)

更新:由于示例输入不再具有“;” 在末尾。

于 2012-05-17T13:51:11.313 回答
0
echo 'adad;sfs;sdfsf;fsdfs;' | sed -r 's/(.*);(.*);/\1 jjjj;\2;/'

你不需要否定 ; 因为 sed 默认情况下是贪婪的,并且会选择尽可能多的字符。

于 2012-05-17T13:52:34.633 回答