我的 Linux 系统上有一个这样的文件,我希望使用 Python 脚本将其更改为下面的输出。
1_file_name=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_file_name=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
为时,您可以打印两个字段,在本例中为第一个字段和最后一个字段[/=]
。
$ 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
虽然一般不推荐这样做,但这里有一个 shell 循环来解决这个问题:
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
值以 string 结尾_file_name
,则实用程序会修改该值basename
,该实用程序仅返回其参数中路径名的文件名部分。如果您没有以 结尾的路径名/
,那么您可以使用${value##*/}
代替整个命令替换。
然后,该printf
调用输出密钥及其可能修改的值,以及=
中间值。
和sed
:
sed 's|^\([^=]*_file_name=\).*/|\1|' file
=
在给定正则表达式匹配的每一行上,这将删除第一个字符和最后一个字符之间的位/
。如果 后面的路径名是以 a结尾的=
目录的路径名,则这可能会做错误的事情。/
awk
可以像这样使用:
awk -F '=' 'BEGIN { OFS = FS } $1 ~ /^[^=]*_file_name$/ { sub("=.*/", "=", $0) }; 1' file
这或多或少是初始 shell 循环到awk
程序的直接转换。
读取带有=
- 分隔字段的行,sub()
只要第一个字段与上述变体中使用的类似表达式匹配,就会触发sed
。该sub()
调用删除了从第一行=
开始到最后一行的所有内容/
。
与sed
变体一样,如果路径名是目录的路径名,并且以/
.