Bash 스크립트에서 다음 변수를 사용하고 있습니다 - val1, val2
val1은 운영 체제 Linux에 존재해야 하는 모든 디스크를 나타냅니다.
val2는 운영 체제 Linux의 현재 디스크를 나타냅니다.
내 목표는 "$val1" 변수에서 "$val2" 디스크를 제거하는 것입니다.
val1="sdb sdc sdd sde sdf sdg sdh sdi sdj sdk"
val2="sdb sdc sdf sdd sde sdg"
예상 결과:
val3=sdh sdi sdj sdk
그리고 다음과 같이 val3의 결과를 설정합니다.
답변1
그리고sed
치환:
val3=$(sed -E 's/\<('"$(tr ' ' '|' <<<"$val2")"')\> *//g' <<<"$val1")
echo "$val3"
sdh sdi sdj sdk
$(tr ' ' '|' <<<"$val2")
- 정규식 교대 그룹을 모방하여sdb|sdc|sdf|sdd|sde|sdg
전체 구조는 다음과 같아야 합니다.\<(sdb|sdc|sdf|sdd|sde|sdg)\>
\<
및\>
- 단어 경계입니다.
답변2
일방 통행:
$ val1="sdb sdc sdd sde sdf sdg sdh sdi sdj sdk"
$ val2="sdb sdc sdf sdd sde sdg"
$ comm -23 <(echo "$val1" | sed "s/ /\n/g" | sort) <(echo "$val2" | sed "s/ /\n/g"| sort) | paste -sd" "
sdh sdi sdj sdk
$
echo "$val1" | sed "s/ /\n/g" | sort
: 변수 목록을 평면화 및 정렬
comm -23
: 평면화된 val1 가져오기 고유 콘텐츠
paste -sd" "
: 결과를 연결하려면 공백을 사용하세요.
답변3
주문하다
echo $val1| tr " " "\n" > val1.txt; echo $val2| tr " " "\n" > val2.txt; val3=`awk 'NR==FNR {a[$1];next}!($1 in a) {print $1}' val2.txt val1.txt` ;echo $val3
산출
echo $val3
sdh sdi sdj sdk
답변4
그리고 grep
그리고프로세스 교체:
#!/bin/bash
val1='sdb sdc sdd sde sdf sdg sdh sdi sdj sdk'
val2='sdb sdc sdf sdd sde sdg'
val3="$(grep -v -F -f <(printf "%s\n" $val2) <(printf "%s\n" $val1) | xargs)"
echo "$val1"
echo "$val2"
echo "$val3"
절차적 대체는 printf "%s\n"
목록과 var2를 var1
한 줄에 하나의 항목이 있는 파일처럼 보이게 만드는 데 사용됩니다 grep
. var2
옵션의 입력 "파일" -f
이고 var1
grep의 "파일"입니다. xargs
여러 줄의 출력을 공백으로 구분된 단일 문자열로 변환하는 grep
게으르지만 유용한 트릭입니다 .
배열도 마찬가지입니다.
#!/bin/bash
val1=(sdb sdc sdd sde sdf sdg sdh sdi sdj sdk)
val2=(sdb sdc sdf sdd sde sdg)
val3=($(grep -vFf <(printf "%s\n" "${val2[@]}") <(printf "%s\n" "${val1[@]}")))
echo "${val1[@]}"
echo "${val2[@]}"
echo "${val3[@]}"