通过SED awk在文件中的特定位置插入一个字符串

时间:2012-05-17 13:26:16

标签: shell sed awk tr

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

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

这可能与SED一起使用吗?

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

之前:

adad;sfs;sdfsf;fsdfs

string = jjjjj

adad;sfs;sdfsf jjjjj;fsdfs

提前致谢

6 个答案:

答案 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;'
  • -r选项代表 extented Regexp
  • @是分隔符,已知的/分隔符可以替换为任何其他字符
  • 我们将所有不是;;最后一个,$平均行尾的内容匹配的内容
  • 我的解释的最后一部分是使用()
  • 捕获的
  • 最后,我们通过添加“; jjjj”来替换匹配部分,并将其与捕获的部分连接起来

修改: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默认是贪婪的,并会选择尽可能多的字符。