sed:在给定字符串之前/之后的第 N 个字符之后插入文本

sed:在给定字符串之前/之后的第 N 个字符之后插入文本

使用sed,如何在出现某个字符串之前(或之后)的字符之后插入文本N。例如,假设要编辑的文本行如下:

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

在文本文件中找到此行后(可能通过唯一字符串command),我希望在之前的第二个(N=2)分号之后插入文本keyword(即,分号分隔linesof)。我特别想用于sed此目的。

继续这个例子,预期的输出将是:

command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'

其中INSERTED_STRING;(提供给 sed,例如通过 shell 变量)被插入到所需的位置。

答案1

我更喜欢简单的:

sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'

在关键字之前插入两个字段。一般的解决方案是

sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"

但请注意,N与您的问题相比, 的偏移量为 1:这里,N=2意味着在 insert 和 之间有两个字段keyword

说明:/command/仅选择带有 的行command,因此其他行保持不变。([^;]*;\)匹配包含以下分号的一个字段(一系列非分号)。通过在其后面添加\{$N\}模式匹配$N字段。以下keyword完成此匹配keyword以及$N之前的字段。替换模式由插入的字符串 和 组成&,它被匹配的所有内容替换(所以最后,它不是替换,而是插入)。

简短且使用扩展正则表达式可读性更好:

sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"

答案2

使用sed,您只能更改模式的第三次出现,即此处的分号。

sed 's/;/;INSERTED_STRING;/3' <<<"$string"

编辑: 替换另一个特定字符串之前第 N次出现的字符串模式字符串 keyword(“相对出现”,在您的情况下是第二次出现)如果行与 uniqe 字符串匹配command。):

sed -r '/command/ s/([^;]*;){1}keyword/INSERTED_STRING;&/' <<<"$string"

答案3

如果您将;- 分隔位视为记录的字段,则可以awk像这样执行此操作:

$ awk -F';' -vOFS=';' -vstring="NEW TEXT" '{ $4 = $4 ";" string; print }' file
command -some -args -c 'a quoted section;some;lines;of code;NEW TEXT;keyword;more lines;etc();'

awk会将-F';'行分成file许多由;- 分隔的字段。然后,代码将通过附加额外的内容;和变量中保存的字符串string(在命令行上定义)来修改第四个此类字段,并输出具有修改后的字段的数据。输出同样以;- 分隔。

相关内容