파일 이름에서 변수 형식을 검색하려면 sed를 사용해야 합니다. 이전 코드를 업데이트하고 있습니다.
cat /directory/filename1.xml | sed -e "s/XYZABC/${c}/g" > /directory/filename2.xml
의 값은 ${c}
다른 파일에 있으며 매일 변경됩니다. sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?
다음은 몇 가지 추가 배경 정보입니다. 처음에 이 내용을 포함하지 않은 점 사과드립니다. ${c}
쿼리 횟수를 저장하는 데 사용되는 sqlplus 변수입니다. 파일에서 이 개수를 검색해야 합니다. 쿼리 횟수 Count=[$c]
가 되는 파일에 저장됩니다 . 첫 번째 xml 파일에서 XYZABC를 바꾸고 결과를 새 xml 파일에 저장 [$c]
해야 합니다 .$c
업데이트: 비슷한 문제가 있는 사람이 있는 경우 다음을 수행하여 작업했습니다.
rm /directory/folder/variablefilename.dat
echo $c >> /directory/folder/variablefilename.dat
d=$(grep [0-9] /directory/folder/variablefilename.dat)
sed -3 "s/ABC123/${d}/g" /directory/folder/inputfile.xml >> /directory/folder/outputfile.xml
답변1
일반적으로 sed(또는 Perl, Ruby)를 사용하여 파일을 수정하려는 경우 이 -i
옵션을 추가합니다. XML의 속성 할당에 대해 논의하고 있다고 가정해 보겠습니다.
changeit() {
let newval="$1"
shift;
# "$@" now contains all filenames
sed -i -e 's/(XYZABC[[:space:]]*=[[:space:]]*)"([^"]*)"/\1"'"$newval"'";/' "$@"
}
changeit happy-happy /directory/filename1.xml
테스트하기 전에 디렉터리/파일을 백업해 두고 비교해 보세요. sed -i
매우 해로울 수 있습니다.
이는 한 줄에 하나의 교체를 적용한다는 점에 유의하십시오. 파일당 한 번씩 추가 질문/답변을 볼 수 있습니다. 한 줄에 여러 번 입력하려면 g
마지막 슬래시( /
) 뒤에 추가하세요.
인용 규칙 설명: 잘 구성된 XML은 속성 값을 큰따옴표로 캡슐화한다고 가정합니다. 그래서 우리는 VARNAME = "something"
이것이 작동하는 한 .무엇자체에는 이스케이프된 큰따옴표 문자가 포함되어 있지 않습니다. 따라서 쉘에서는 큰따옴표를 유지해야 하며 이를 위해 작은따옴표를 사용합니다. 이렇게 하면 변수가 $newval
보간되는 것을 방지할 수 있습니다. 따라서 변수가 확장되고 확장되기 전에 명령의 인용된 부분을 닫아야 합니다 $newval
. 이제 쉘이 포함된 공백이 새 인수(파일 이름과 함께)를 시작한다고 생각하지 않도록 큰따옴표로 묶어야 합니다. sed 출력의 일부로 큰따옴표를 바꿀 수 있도록 작은따옴표를 복원합니다.