두 개의 쉘 변수를 병합 및 정렬하고 중복을 제거하는 방법

두 개의 쉘 변수를 병합 및 정렬하고 중복을 제거하는 방법

내 bash 스크립트에는 "args1"과 "args2"라는 두 개의 변수가 있습니다. 그들 각각은 다음과 같은 것을 가질 것입니다 :

Matching cluster names:
[a-z]+
[a-z]+
...

따라서 "args1"은 다음과 같을 수 있습니다.

Matching cluster names:
dev1ff
dev2ff

그리고 "args2"는 다음과 같을 수 있습니다:

Matching cluster names:
dev2ff
dev3ff

이를 결합하여 다음을 생성해야 합니다.

Matching cluster names:
dev1ff
dev2ff
dev3ff

다음 줄을 사용하면 이에 가까워질 수 있습니다.

echo "$(echo "$args1" | grep -v "^Matching") $(echo "$args2" | grep -v "^Matching")" | sort -u

이는 대략 다음과 같은 결과를 생성합니다.

Matching clusters:
dev1ff
dev2ff dev3ff

실제 이름은 중요하지 않지만 문제는 첫 번째 블록과 두 번째 블록 사이에 개행 문자를 삽입할 수 없다는 것입니다. 두 "$(...)" 블록 사이의 공간에 대해 여러 가지 변형을 시도했지만 아무것도 작동하지 않습니다.

답변1

명령 대체는 후행 줄 바꿈을 제거하므로 두 명령 대체 사이의 공백을 유일한 구분 기호로 사용하게 됩니다. 결과는 다음과 같습니다.

echo지원되는 모든 경우에 -e사용할 수 있습니다.

echo -e "$(...)\n$(...)" | sort -u

중간에 개행 문자를 추가합니다. 그러나 데이터에 백슬래시가 있으면 echo백슬래시도 변환됩니다. 이를 방지하려면 printf다음과 같이 사용할 수 있습니다.

printf "%s\n" "$(...)" "$(...)" | sort -u

(형식 문자열은 필요한 만큼 반복되므로 두 개의 인수를 사용할 때 "%s\n"와 동일한 방식으로 작동합니다 . 또한 어쨌든 대신 %s\n%s\n사용하고 싶을 수도 있습니다 .printfecho왜 printf가 echo보다 나은가요?)


그러나 실제로는 명령 대체가 필요하지 않습니다. echo "$(something)"직접 실행하는 것과 비슷합니다 something. sort -u중괄호를 사용하여 지시하려는 두 명령을 그룹화 할 수 있습니다 .

{ echo "$args1" | grep -v "^Matching"; echo "$args2" | grep -v "^Matching"; } | sort -u

또는 두 grep이 동일한 작업을 수행한다는 점에 유의하세요. grep을 중괄호 밖으로 이동하세요.

{ echo "$args1"; echo "$args2"; } | grep -v "^Matching" | sort -u

위의 두 명령에서 echos를 쉘 변수를 전달하지 않고 이 출력을 생성하는 다른 명령으로 바꿀 수 있습니다.

그러나 쉘 변수에 목록이 있는 경우 printf여러 명령을 그룹화하지 않고도 두 목록을 동시에 인쇄할 수도 있습니다.

printf "%s\n" "$args1" "$args2" | grep -v "^Matching" | sort -u

관련 정보