내 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
두 개의 필드(이 경우 첫 번째 필드와 마지막 필드)를 인쇄할 수 있습니다 [/=]
.
$ 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
값이 string 으로 끝나는 경우 해당 인수에서 경로 이름의 파일 이름 부분만 반환하는 _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이 디렉터리의 경로 이름이고 /
.