![특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입합니다.](https://linux55.com/image/88611/%ED%8A%B9%EC%A0%95%20%EC%A4%84%EC%9D%98%20%EB%8B%A4%EB%A5%B8%20%EB%B3%80%EC%88%98%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EB%92%A4%EC%97%90%20%EB%B3%80%EC%88%98%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%82%BD%EC%9E%85%ED%95%A9%EB%8B%88%EB%8B%A4..png)
특정 줄의 다른 변수 텍스트 뒤에 변수 텍스트를 삽입하려고 합니다. 다음은 지금까지 시도한 것입니다. 변수를 보고 계속 적용할 수 있도록 따옴표를 이스케이프 처리할 수 있는지 아는 한 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/" …
쉘이 값을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가 명령을 실행하기 전에 발생하므로 /가 's'에 나타날 수 있는 이유입니다. 해결해야 하는 변수의 내용(awk의 경우에도 해당)은
다음 형식의 대체 명령을 작성한다는 것을 의미합니다.
s/<pattern>/<replacement Pattern>/
'/ ' s 다음은 구분 기호를 사용하는 데 사용됩니다. 명령의 일부에 ; 를 넣으면 위에 표시된 대로 ; 를 사용하여 $VAR 변수의 내용을 일치시켜야 합니다. 이는 패턴 '\n' 및 VAR2와 일치하는 새 행을 인쇄한다는 의미입니다. 콘텐츠.
앗.. 아래 줄 부분은 못봤네요.. 패턴이 고정됐네요.
답변3
를 사용하려면 awk
options를 사용하여 변수를 전달해야 합니다 bash
. awk
-v
awk -v v=$VAR -v v1=$VAR1 '/v/ { print; print v1; next }1' ~/Scripts/tmp/file.txt
그러나 더 정확하고 자세한 해결책은 Rob의 답변을 확인하십시오.