使用“sed”命令查找模式,然后使用 Python 替换之后的所有内容

使用“sed”命令查找模式,然后使用 Python 替换之后的所有内容

我的 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}。默认操作awkprint1在最后。最后将结果保存在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变体一样,如果路径名是目录的路径名,并且以/.

相关内容