sed 명령에 변수 전달

sed 명령에 변수 전달

6개의 열이 있는 파일이 있습니다.

FILEDESCRIPTOR . DESCR00001     FILEDESCRIPTOR  .  DESCRIPTIVENAME
FILEDESCRIPTOR . LSTUPDNAM      FILEDESCRIPTOR  .  LASTUPDATENAME
FILEDESCRIPTOR . LOCAT00001     FILEDESCRIPTOR  .  LOCATION_ID
FILEDESCRIPTOR . RETAILPRC      FILEDESCRIPTOR  .  RETAILPRICE
FILEDESCRIPTOR . LSTUPDTIME     FILEDESCRIPTOR  .  UPDTIMESTAMP
INDUSTRYDIVISION . DESCR00001   INDUSTRYDIVISION  .  DESCRIPTION
INDUSTRYDIVISION . DIVIS00001   INDUSTRYDIVISION  .  DIVISIONCODE
INDUSTRYGROUP . DESCR00001      INDUSTRYGROUP  .  DESCRIPTION
INDUSTRYGROUP . DIVIS00001      INDUSTRYGROUP  .  DIVISION_ID

내가 해야 할 일은 단일 공백으로 구분된 처음 3개 열을 처리하여 변수에 단일 열로 저장한 다음 단일 공백으로 구분된 다음 3개 열을 다른 변수에 저장하는 것뿐입니다. 그런 다음 sed첫 번째 변수를 두 번째 변수로 바꿉니다.

아래 스크립트를 시도했지만 오류가 발생했습니다.

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]];
do
        column2="$(echo -e "$line \n" | awk '{print $4, $5, $6}')"
        #column3="$(echo -e "$line \n" | awk '{print $3}')"
        column1="$(echo -e "$line \n" | awk '{print $1, $2, $3}' )"
        #echo " $column1"
        #echo " $column2"
                 sed  "s/${column1}/${column2}/g" IMS_Procedures.txt
done < file

스크립트가 작동하지 않습니다. 내가 얻는 오류는 다음과 같습니다.

sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 20: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 30: unterminated `s' command

무엇을 할 수 있나요?

답변1

필요하지 않습니다 while read.
간단히 입력 파일을 처리할 수 있습니다.

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile

이를 sed스크립트로 변환합니다.

s/FILEDESCRIPTOR . DESCR00001/FILEDESCRIPTOR . DESCRIPTIVENAME/g
s/FILEDESCRIPTOR . LSTUPDNAM/FILEDESCRIPTOR . LASTUPDATENAME/g
s/FILEDESCRIPTOR . LOCAT00001/FILEDESCRIPTOR . LOCATION_ID/g
s/FILEDESCRIPTOR . RETAILPRC/FILEDESCRIPTOR . RETAILPRICE/g
s/FILEDESCRIPTOR . LSTUPDTIME/FILEDESCRIPTOR . UPDTIMESTAMP/g
s/INDUSTRYDIVISION . DESCR00001/INDUSTRYDIVISION . DESCRIPTION/g
s/INDUSTRYDIVISION . DIVIS00001/INDUSTRYDIVISION . DIVISIONCODE/g
s/INDUSTRYGROUP . DESCR00001/INDUSTRYGROUP . DESCRIPTION/g
s/INDUSTRYGROUP . DIVIS00001/INDUSTRYGROUP . DIVISION_ID/g

sed -f-IMS_를 처리하기 위해 두 번째 항목에 전달합니다 Procedures.txt.

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile | sed -f- IMS_Procedures.txt

"이것은 파일이고 이 명령은 단일 공백으로 인쇄합니다"가 무엇을 의미하는지 잘 이해하지 못합니다. 따라서 필드가 infile여러 공백으로 구분된 경우 tr먼저 다음을 사용할 수 있습니다.

tr -s '[[:blank:]]' ' ' <infile | sed 's| |/|3;s|.*|s/&/g|' | sed -f- IMS_Procedures.txt

답변2

$column1및 변수 에서 $column2끝에 줄 바꿈이 있으면 sed명령은 다음과 같습니다.

sed  "s/FILEDESCRIPTOR . DESCR00001
  /FILEDESCRIPTOR . DESCRIPTIVENAME
  /g" IMS_Procedures.txt

sed이것을 종료되지 않은 s 명령으로 인식하십시오.


대신 이것을 사용하십시오:

while read -r a b c d e f; do
  sed -i "s/$a $b $c/$d $e $f/g" IMS_Procedures.txt
done <file
  • read$a변수 에 6개 필드 저장$f
    • 그런 다음 sed공백으로 구분된 문자열인 처음 3개 필드를 파일의 마지막 3개 필드로 바꿉니다 IMS_Procedures.txt. -i변경 내용을 화면에 인쇄하는 대신 파일에 기록하려면 내부 편집을 활성화하세요.

.in은 점 sed뿐만 아니라 모든 문자와 일치합니다. \.input 에서 이스케이프 되어야 합니다 file.

답변3

나는 명백한 것을 시도할 것이다:

awk '{printf "s/%s%s%s/%s%s%s/\n",$1,$2,$3,$4,$5,$6} ' file |
sed -i -f - IMS_Procedures.txt

sed 파일은 awk에 의해 생성됩니다.

조정 공간을 사용할 수 있습니다

awk '{printf "s/%s %s %s/%s %s %s/\n",$1,$2,$3,$4,$5,$6}

관련 정보