특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입합니다.

특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입합니다.

특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입하려고 합니다. 다음은 지금까지 시도한 것입니다. 변수를 보고 계속 적용할 수 있도록 따옴표를 이스케이프 처리할 수 있는지 아는 한 awk작동해야 하지만 방법은 모르겠습니다.

#!/bin/sh

VAR=$(head -n1 ~/Scripts/tmp/file.txt)
VAR1=$(head -n1 ~/Scripts/tmp/file1.txt)

awk '/$VAR/ { print; print "$VAR1"; next }1' ~/Scripts/tmp/file.txt

답변1

awk 스크립트에 문자열을 전달하려면 환경 변수를 통해 전달하세요.

export VAR VAR1
awk '
    1
    $0 == ENVIRON["VAR"] {print ENVIRON["VAR1"]}
' ~/Scripts/tmp/file.txt

논리를 더 간단하게 만들기 위해 스크립트를 재구성했습니다. 또한 정규식 일치를 문자열 비교로 대체했습니다. 정규식 일치를 사용하면 $VAR정규식으로 처리되며 문자열 비교를 수행하지 않습니다. /$VAR/필요한 값 도 사용하지 않습니다 VAR(이것은 awk가 아니라 Perl 구문입니다) match($0, VAR).

실제로 작동하지 않는 다른 솔루션에 대한 참고 사항(변수에 특수 문자가 포함되지 않은 경우에만 작동하며 특수 문자는 방법에 따라 다릅니다):

  • awk -v awkvar="$VAR" '$0 == awkvar …'줄 내용에서 백슬래시를 확장합니다.
  • awk "/$VAR/" …쉘이 값을 VARawk 조각으로 확장하도록 합니다. 예를 들어, file.txt포함된 경우 ^/ {system("touch ~/naughty")} /명령을 실행합니다.touch ~/naughty

또 다른 방법은 awk가 모든 파일을 읽도록 하는 것입니다.

awk '
    BEGIN { VAR1 = getline <"~/Scripts/tmp/file1.txt"; }
    NR == 1 {VAR = $0}
    1
    $0 == ENVIRON["VAR"] {print ENVIRON["VAR1"]}
' ~/Scripts/tmp/file.txt

답변2

가능한 AWK 솔루션 중 하나:

   awk '/'$VAR'/ { print; print "'$VAR1'"; next }1'

모든 외부 변수 주위에 ' 따옴표를 묶습니다.

제안된 다른 게시물과 같은 변수를 전달하는 또 다른 가능한 솔루션은 VAR1을 awk 변수로 전달하는 것입니다. 하지만 작은따옴표 블록을 이스케이프하려면 여전히 VAR을 사용해야 한다고 생각합니다.

 awk -v var=$VAR1 '/'$VAR'/ { print; print var; next }1'

sed를 사용해 볼 수 있습니다. :) 이러한 종류의 대체를 위해 특별히 설계되었습니다.

 sed "s/$VAR.*/\0\n$VAR1/" ~/Scripts/tmp/file.txt     

한 줄에 여러 VAR 인스턴스가 있을 수 있는 경우 sed 명령 끝에 g(전역)를 추가하면 발견된 첫 번째 일치 항목에서 중지되지 않습니다.

 sed "s/$VAR.*/\0 $VAR1/g" ~/Scripts/tmp/file.txt 

중요한! : '/' 문자가 VAR 또는 VAR1 변수에 나타나지 않는지 확인하세요. 가능하다면 해당 문자를 awk 또는 sed로 이스케이프해야 합니다. 또는 sed를 사용하여 명령의 구분 기호를 ';

 sed "s;$VAR.*;\0\n$VAR1;" ~/Scripts/tmp/file.txt

sed 명령 설명:
sed 명령 주위에 작은 따옴표 대신 큰 따옴표 "를 사용하여 VAR 및 VAR1과 같은 변수가 해당 값으로 대체됩니다. 이는 sed가 명령을 실행하기 전에 발생하므로 /가 's'에 나타날 수 있는 이유입니다. 해결해야 하는 변수의 내용(awk의 경우에도 해당)은
다음 형식의 대체 명령을 작성한다는 것을 의미합니다.
s/<pattern>/<replacement Pattern>/
'/ ' s 다음은 구분 기호를 사용하는 데 사용됩니다. 명령의 일부에 ; 를 넣으면 위에 표시된 대로 ; 를 사용하여 $VAR 변수의 내용을 일치시켜야 합니다. 이는 패턴 '\n' 및 VAR2와 일치하는 새 행을 인쇄한다는 의미입니다. 콘텐츠.

앗.. 아래 줄 부분은 못봤네요.. 패턴이 고정됐네요.

답변3

를 사용하려면 awkoptions를 사용하여 변수를 전달해야 합니다 bash. awk-v

awk -v v=$VAR -v v1=$VAR1 '/v/ { print; print v1; next }1' ~/Scripts/tmp/file.txt

그러나 더 정확하고 자세한 해결책은 Rob의 답변을 확인하십시오.

관련 정보