"sed"コマンドを使用してパターンを見つけ、Pythonを使用してパターンの後ろのすべての項目を置き換えます。

"sed"コマンドを使用してパターンを見つけ、Pythonを使用してパターンの後ろのすべての項目を置き換えます。

私の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}以前に設定されている場合は、FS2つのフィールド(この場合は最初のフィールドと最後のフィールド)を印刷できます[/=]

$ 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。最後に、結果をファイルに保存します。print1outputfile

答え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()呼び出しは、=最初の行から最後の行まですべての内容を削除します/

バリアントと同様に、sedpathnameはディレクトリのパス名です/

関連情報