我有一个文件,其中有一行
byte address[] = { 0x54, 0x36, 0x45 };
我试图通过用户提供的 3 个命令行参数来更改文件 -
grep byte | sed 's/\{.*\}/{ 0x$1, 0x$2, 0x$3 }/g' file.c
但没有成功。
使用的命令是 -
sh script.sh 44 33 22
输出/输出-
byte address[] = { 0x44, 0x33, 0x22 };
任何使用帮助sed/awk
都会很棒!
答案1
您需要意识到 的\{
特殊之处sed
。所以你需要这个:
#!/bin/sh
# filename: yourscript.sh
# usage: ./yourscript.sh 44 33 22
for arg; do set "$@" " 0x$arg"; shift; done
IFS=",";
sed -e "/byte address\[\]/s/{[^}]*}/{$* }/" yourfile.c
结果
When invoked as:
% ./yourscript.sh 44 33 22
byte address[] = { 0x44, 0x33, 0x22 };
解释
hexified
第一个任务是从参数中获取数字。我们通过使用循环遍历参数列表来获得这一点for
。每次,我们将当前参数的十六进制版本附加到参数列表的末尾$@
,同时shift
从列表的前面删除当前参数。所以这意味着在循环迭代结束时for
我们将得到hexified
参数列表。- 现在我们将 设为
IFS
逗号,以便用逗号连接参数。 - sed 代码将
"$*"
列表引入替换部分内sed
s///
。