Bash를 사용하여 문자열에서 하위 문자열의 발생 수를 어떻게 계산할 수 있습니까?
예:
이 하위 문자열이 몇 번인지 알고 싶습니다.
Bluetooth
Soft blocked: no
Hard blocked: no
...이 문자열에서 발생합니다 ...
0: asus-wlan: Wireless LAN
Soft blocked: no
Hard blocked: no
1: asus-bluetooth: Bluetooth
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
113: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
참고 I : sed, grep, awk를 사용하여 여러 가지 접근 방식을 시도했습니다. 공백과 여러 줄이있는 문자열이 있으면 아무것도 작동하지 않는 것 같습니다.
참고 II : 저는 Linux 사용자이며 일반적으로 Linux 배포판에서 볼 수있는 응용 프로그램 / 도구 외부에 설치하지 않는 솔루션을 시도하고 있습니다.
중대한:
아래의 가상 예와 같은 것을 원합니다. 이 경우 두 개의 Shell 변수 (Bash)를 사용 합니다.
예:
STRING="0: asus-wlan: Wireless LAN
Soft blocked: no
Hard blocked: no
1: asus-bluetooth: Bluetooth
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
113: hci0: Bluetooth
Soft blocked: no
Hard blocked: no"
SUB_STRING="Bluetooth
Soft blocked: no
Hard blocked: no"
awk -v RS='\0' 'NR==FNR{str=$0; next} {print gsub(str,"")}' "$STRING" "$SUB_STRING"
참고 : 우리는 단지 설명을 위해 awk를 사용하고 있습니다!
와 함께 perl
:
printf '%s' "$SUB_STRING" |
perl -l -0777 -ne '
BEGIN{$sub = <STDIN>}
@matches = m/\Q$sub\E/g;
print scalar @matches' <(printf '%s' "$STRING")
으로 bash
만, 당신은 항상 뭔가를 같이 할 수있는 :
s=${STRING//"$SUB_STRING"}
echo "$(((${#STRING} - ${#s}) / ${#SUB_STRING}))"
그 $s
안에 $STRING
있는 모든 항목이 $SUB_STRING
제거 된 포함입니다. 와 $SUB_STRING
사이의 문자 수 차이를 계산하고 그 자체 의 길이로 나누어 제거 된 s 의 수를 알아냅니다 .$STRING
$s
$SUB_STRING
POSIXly, 다음과 같이 할 수 있습니다.
s=$STRING count=0
until
t=${s#*"$SUB_STRING"}
[ "$t" = "$s" ]
do
count=$((count + 1))
s=$t
done
echo "$count"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다