특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트 삽입

특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트 삽입

특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입하려고 합니다. 다음은 제가 알 수 있는 한 지금까지의 시도입니다. 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정규식으로 처리되고 문자열 비교를 수행하지 않습니다. 그리고 (awk가 아니라 Perl 구문입니다) /$VAR/값도 사용하지 않을 것 입니다.VARmatch($0, VAR)

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

  • awk -v awkvar="$VAR" '$0 == awkvar …'줄 내용에서 백슬래시를 확장합니다.
  • awk "/$VAR/" …VAR쉘이 awk 스니펫으로서의 값을 확장하게 합니다 . 예를 들어, 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에 의해 실행되기 전에 발생하므로 /가 가능한 이유는 다음과 같습니다. 이를 해결해야 하는 변수 내용에 있어야 합니다(awk의 경우에도 마찬가지입니다) 's'는 s/<pattern>/<replacement Pattern>/
형식의 대체 명령을 작성함을 나타냅니다. '/ ' s 바로 뒤에는 명령 섹션을 구분하는 데 사용되는 구분 기호가 있으므로 위에 표시된 대로 ; 를 사용해야 합니다. 패턴은 \0입니다. 이는 패턴과 새 줄 '\n' 및 VAR2의 내용이 일치하는 것을 인쇄한다는 의미입니다.


이런.. 아래 줄에 대한 부분은 안보이네요.. 고정된 패턴이군요.

답변3

를 사용하려면 다음 옵션을 사용하여 변수를 에 awk전달해야 합니다 . bashawk-v

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

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

관련 정보