私のLinuxシステムにはこのようなファイルがありますが、Pythonスクリプトを使って以下の出力に変更したいと思います。
1_ファイル_名前=xyz.vps:
input0_bpp=8
input0_is_padding_enable=0
input0_task0_file_name=${MY_DIR}/validation/suites/pole1/test_data/cam_1024x512.bin
output0_bpp=8
output0_is_padding_enable=0
output0_task0_file_name=${MY_DIR}/validation/suites/pole1/test_data/cam_1024x512.bin
私が欲しい出力文書(1_ファイル_名前=xyz.vps)次のように:
input0_bpp=8
input0_is_padding_enable=0
input0_task0_file_name=cam_1024x512.bin
output0_bpp=8
output0_is_padding_enable=0
output0_task0_file_name=cam_1024x512.bin
答え1
ファイルパスだけを取り除くことができるようです。
sed -e 's,file_name=.*/,file_name=,' < file > newfile
トリックを実行する必要があります...含まれている各行の間と全体のfile_name=.../...
セクションを占めます。=
最後 /
資格があります。
「位置」を編集してGNUを使用するには、次のようにsed
します。
sed -i -e 's,file_name=.*/,file_name=,' file # This modifies the file. Back it up first!
答え2
awk
行が{MY_DIR}
以前に設定されている場合は、FS
2つのフィールド(この場合は最初のフィールドと最後のフィールド)を印刷できます[/=]
。
$ awk -v FS='[/=]' -v OFS='=' '/{MY_DIR}/ {print $1, $NF;next} 1' file > outputfile
input0_bpp=8
input0_is_padding_enable=0
input0_task0_file_name=cam_1024x512.bin
output0_bpp=8
output0_is_padding_enable=0
output0_task0_file_name=cam_1024x512.bin
ここでの条件は /{MY_DIR}/
アクションがということです{print $1, $NF;next}
。基本的な作業は最後にありますawk
。最後に、結果をファイルに保存します。print
1
outputfile
答え3
これは通常推奨されませんが、この問題を解決するためのシェルループは次のとおりです。
while IFS='=' read -r key value; do
case $key in (*_file_name) value=$( basename "$value" ); esac
printf '%s=%s\n' "$key" "$value"
done <file
名前付きファイルの各行について、file
変数の前のビットと変数の後のすべてのビットを読み取ります。=
key
=
value
$key
値が文字列で終わると、その引数からパス名のファイル名部分のみを返す_file_name
ユーティリティによって値が変更されます。basename
で終わるパス名がない場合は、コマンド全体を置換に置き換える/
ことができます。${value##*/}
その後、呼び出しはprintf
キーと変更できる値、=
中間値を出力します。
そしてsed
:
sed 's|^\([^=]*_file_name=\).*/|\1|' file
=
与えられた正規表現に一致する各行から、最初の文字と最後の文字の間のビットが削除されます/
。次のパス名が=
。/
awk
次のように使用できます。
awk -F '=' 'BEGIN { OFS = FS } $1 ~ /^[^=]*_file_name$/ { sub("=.*/", "=", $0) }; 1' file
awk
これは初期シェルループをプログラムに直接変換したのと同じです。
=
区切りフィールドがある行を読み取ります。sub()
これは、最初のフィールドが上記のバリアントで使用されている同様の式と一致するたびにトリガーされますsed
。このsub()
呼び出しは、=
最初の行から最後の行まですべての内容を削除します/
。
バリアントと同様に、sed
pathnameはディレクトリのパス名です/
。