파일에 이 줄이 있어요
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_addcolumn
를 ColumnAdd
.
시험:
$ 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