한 행의 필드에서 값을 추출하고 해당 값을 다음 행에 추가합니다.

한 행의 필드에서 값을 추출하고 해당 값을 다음 행에 추가합니다.

파일에 이 줄이 있어요

x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

파일의 "cmd" 필드를 다음과 같이 바꾸고 싶습니다.

x;x;x;x;x;x;cmd="ColumnAdded TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDropped TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y ";x;x;x;x

어떻게 해야 하나요?

답변1

다음 Bash 스크립트를 사용해 볼 수 있습니다.

while read ln; do
    out=`sed 's/\([^"]*\)"\([^"]*\)\(.*\)/\1"\2 || \2\3/' <<< "$ln"`
    out=`sed -e 's/lbk_addcolumn/ColumnAdded/' -e 's/lbk_dropcolumn/ColumnDropped/' <<< "$out"`
    echo "$out"
done < input.txt

input.txt당신의 라인을 포함 하는

답변2

sed -r -e "s/(lbk_addcolumn.*)(\[.*\])\s*(\[.*\])/ColumnAdded \2 \3 || \1 \2 \3/g" \ 
-e "s/(lbk_dropcolumn.*)(\[.*\])\s*(\[.*\])/ColumnDropped \2 \3 || \1 \2 \3/g" input.txt

input.txt당신의 콘텐츠는 어디에 있나요?

답변3

모든 행이 추악한 sed 정규식 패턴 대신 두 행(6*x;cmd="...";4*x)과 동일한 고정 형식을 갖는 경우 아래 대체 명령을 파일에서 수행할 수 있습니다. 파일 읽기 루프가 필요합니다.

핵심은(모든 행의 형식이 안정적인 경우) "as 구분 기호를 사용하여 행을 3개의 별도 필드로 분리하는 것입니다.

$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)

또는:

$ a=$(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)
$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <<<"$a"

awk는 as 구분 기호를 사용하여 파일의 각 줄을 구분합니다 ". 빈 줄이면 빈 줄을 인쇄하고 계속하고, 그렇지 않으면 모든 행 필드를 원하는 순서로 인쇄합니다
.$0=""

마지막으로 sed는 처음 발견된 텍스트 lbk_addcolumnColumnAdd.

시험:

$ cat e.txt
x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

# sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' e.txt)
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

awk만 사용하고 gsub awk 함수를 사용해도 동일한 결과를 얻을 수 있습니다.

$ awk -F'"' '{if ($0=="") print $0;else {a=$2;gsub("lbk_addcolumn","ColumnAdd",$2);gsub("lbk_dropcolumn","ColumnDrop",$2);print $1"\""$2" || "a"\""$3;}}' e.txt
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

awk에 대한 더 나은 소개:

    $ awk -F'"' '{
      if ($0=="") print $0;
      else {
        a=$2;
        gsub("lbk_addcolumn","ColumnAdd",$2);
        gsub("lbk_dropcolumn","ColumnDrop",$2);
        print $1"\""$2" || "a"\""$3;
           }
                 }' e.txt

관련 정보