使用sed
,如何在出现某个字符串之前(或之后)的字符之后插入文本N
。例如,假设要编辑的文本行如下:
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
在文本文件中找到此行后(可能通过唯一字符串command
),我希望在之前的第二个(N=2)分号之后插入文本keyword
(即,分号分隔lines
和of
)。我特别想用于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
(在命令行上定义)来修改第四个此类字段,并输出具有修改后的字段的数据。输出同样以;
- 分隔。