![sed 命令检查任何列中行的第一个单词并替换](https://linux22.com/image/184621/sed%20%E5%91%BD%E4%BB%A4%E6%A3%80%E6%9F%A5%E4%BB%BB%E4%BD%95%E5%88%97%E4%B8%AD%E8%A1%8C%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8D%95%E8%AF%8D%E5%B9%B6%E6%9B%BF%E6%8D%A2.png)
文件.txt:
if (early_timeout == TRUE) {
sprintf(send_buff, "XYZ: Command timed out",
command_timeout);
result = UNKNOWN;
}
以上是具有适当缩进的文件的示例内容。尝试XYZ
用ABC
using替换时有点困难sed
,
- 使用
sed -i '/^.*sprintf/ s/XYZ/ABC/g' file.txt
But 时,这会导致将 (printf, asprintf) 作为比较单词并替换整个文件中以 (sprintf,asprintf 等) 开头的每一个出现的行,尽管我只需要替换包含sprintf
. - 在这种情况下,当用于
sed -i '/^.sprintf/ s/XYZ/ABC/g' file.txt
比较行的第一个单词时,即sprintf
比较和替换,但如果文件中存在额外缩进,则会失败。
有没有什么方法可以特别比较从任何地方开始的单词,然后 sed 进行替换。
sed -r 's/^[ \t]*//'
我遇到的一种方法是,使用然后 apply将 file.txt 的内容对齐到 std 输出的左侧sed -i '/^.sprintf/ s/XYZ/ABC/g' file.txt
,有没有办法一次性组合和运行或任何其他方式来实现这一目标?这似乎不太有效,我有点迷失了。
答案1
sed '/^[[:blank:]]*sprintf/ {s/XYZ/ABC/g;}' infile
这会将所有XYZ
字符串替换为ABC
行以无或多个前导空格和制表符开头的位置,后跟sprintf
。