1行のファイルがあります。
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
。毎回、現在のパラメータの16進バージョンをパラメータリストの末尾に追加し、$@
リストshift
の前半から現在のパラメータを削除します。つまり、ループの反復が終了するとパラメータのリストがfor
得られます。hexified
IFS
次に、パラメータをコンマで連結できるようにコンマに設定します。- sedコードは
"$*"
交換セクションにリストを紹介しますsed
s///
。