"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}이전에 로 설정된 경우 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. 마지막으로 결과를 파일에 저장합니다.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값이 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()호출은 =첫 번째 줄부터 마지막 ​​줄까지 모든 내용을 삭제합니다 /.

변형 과 마찬가지로 sedpathname이 디렉터리의 경로 이름이고 /.

관련 정보