에서 제안한 방법을 사용하고 있습니다.https://askubuntu.com/questions/434051/how-to-replace-a-string-on-the-5th-line-of-multiple-text-files아카이브의 첫 번째 줄을 수정합니다. 첫 번째 줄 file.txt
은 다음과 같다고 가정합니다.
keepme=change1me
난 갖길 원해
keepme=newstring
문제는 newstring이 var1에 저장된다는 것입니다.
나는 시도했다:
var1=newstring
perl -i -pe 's/(keepme=)(.*)/$1${var1}/ if $.==1' ../file.txt
perl ${var1} -i -pe 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt
두 경우 모두 결과는 다음과 같습니다.
keepme=
만약 내가한다면
perl -i -pe ${var1} 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt
Can't open s/(genome1=)(.*)/$1$ARGV[0]wq/ if $.==1: No such file or directory
답변1
Perl에서 환경 변수에 액세스하려면 $ENV{var1}을 사용하세요.
이렇게 하려면 변수를 내보낼 수 있습니다. 즉, 설정을 해제할 때까지 변수가 설정됩니다.
내보내기 var1=새 문자열
perl -i -pe 's/(keepme=)(.*)/$1$ENV{var1}/ if $.==1' ../file.txt
또는 Perl 명령이 실행될 때 사용하는 변수를 설정하려는 경우 명령 앞에 할당할 수 있습니다.
var1=newstring2 perl -i -pe 's/(keepme=)(.*)/$1$ENV{var1}/ if $.==1' ../file.txt
답변2
${var1}
첫 번째 시도부터 쉘에 의해 확장되고 다른 모든 변수를 보호하기 를 원합니다 $
(Perl이 확장하도록).
perl -i -pe "s/(keepme=)(.*)/\$1${var1}/ if \$. == 1" ../file.txt
작은 따옴표 대신 큰 따옴표를 사용하면 Perl은 newstring
변수 대신 변수 이름을 받게 되며, 백슬래시를 사용하여 다른 달러 기호를 이스케이프 처리하면 쉘이 해당 이름을 영향 없이 전달하게 됩니다.