bash + var2에서 var2에 정의된 문자열을 삭제하는 방법

bash + var2에서 var2에 정의된 문자열을 삭제하는 방법

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이고 var1grep의 "파일"입니다. 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[@]}"

관련 정보