![파일의 모든 항목을 각 항목에 대한 고유한 값으로 바꾸는 방법](https://linux55.com/image/112827/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EA%B0%81%20%ED%95%AD%EB%AA%A9%EC%97%90%20%EB%8C%80%ED%95%9C%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%EA%B0%92%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
아래와 같이 MyID가 여러 번 나타나는 XML 파일이 있습니다.
MyID="dett090900990000"
MyID=""
모든 값을 고유한 값으로 바꾸고 싶습니다 .
예를 들어, xml 파일에 3개의 항목이 있는 경우 MyID=""
스크립트를 실행할 때 MyID 값으로 사용될 매개변수를 전달합니다(그러나 각 항목에 증분 값이 할당됩니다).
즉, 스크립트를 다음과 같이 실행할 때myscript.sh 7777777878889888
출력은 다음과 같아야 합니다(즉, MyID의 모든 값이 변경되고 이제 고유한 값을 갖게 됨을 의미합니다). 무엇이든 가능합니다(숫자, 문자열 및 혼합).
MyID="77777778788898881"
MyID="77777778788898882"
MyID="77777778788898883"
보시다시피 제공된 값에 1, 2, 3이 추가됩니다.
이 문제를 해결하기 위해 간단한 명령을 찾고 있습니다! 감사합니다!
답변1
Perl에서는 다음과 같이 할 수 있습니다:
perl -pe 'BEGIN { $v=shift; }
s/(MyID=")[^"]*(")/$1.$v.++$t.$2/ge' 7777777878889888 foo.xml bar.xml
답변2
간단하지는 않지만 작동합니다. 스크립트에는 두 개의 매개변수가 있습니다. Arg1은 일치시킬 문자열이고 Arg2는 입력 파일의 파일 이름입니다. 솔루션은 sed 대신 awk를 사용합니다.
#!/bin/bash
# myscript.sh
# Usage myscript.sh <string to match> <filename>
MyID=$1
awk -v MyID=$MyID 'BEGIN{ mynum=1; } { if (match($0,MyID) ) { sub(MyID, sprintf("%s%d", MyID, mynum) ) mynum++; } print }' $2