Обновление с учетом ваших комментариев ниже, если пробел одинаков в обеих строках:
awk 'BEGIN{print gsub(ARGV[2],"",ARGV[1])}' "$STRING" "$SUB_STRING"
или если пробел отличается от вашего примера, где строки STRING начинаются с 9 пробелов, а SUB_STRING - с 8:
$ awk 'BEGIN{gsub(/[[:space:]]+/,"[[:space:]]+",ARGV[2]); print gsub(ARGV[2],"",ARGV[1])}' "$STRING" "$SUB_STRING"
Оригинальный ответ:
С GNU awk, если ваш пробел совпадает между файлами и строкой поиска, не содержит метасхем RE, все, что вам нужно:
awk -v RS='^$' 'NR==FNR{str=$0; next} {print gsub(str,"")}' str file
или с любым awk, если ваш ввод также не содержит NUL-символов:
awk -v RS='\0' 'NR==FNR{str=$0; next} {print gsub(str,"")}' str file
, но для полного решения с объяснениями читайте:
С любым POSIX awk в любой оболочке на любом компьютере UNIX:
$ cat str
Bluetooth
Soft blocked: no
Hard blocked: no
$ awk '
NR==FNR { str=(str=="" ? "" : str ORS) $0; next }
{ rec=(rec=="" ? "" : rec ORS) $0 }
END {
gsub(/[^[:space:]]/,"[&]",str) # make sure each non-space char is treated as literal
gsub(/[[:space:]]+/,"[[:space:]]+",str) # make sure space differences do not matter
print gsub(str,"",rec)
}
' str file
2
При использовании не POSIX awk, такого как nawk, просто используйте 0-9
вместо [:space:]
. Если ваша строка поиска может содержать обратную косую черту, нам нужно добавить еще 1 gsub () для их обработки.
В качестве альтернативы, с GNU awk для нескольких символов RS:
$ awk -v RS='^$' 'NR==FNR{gsub(/[^[:space:]]/,"[&]"); gsub(/[[:space:]]+/,"[[:space:]]+"); str=$0; next} {print gsub(str,"")}' str file
2
или с любым awk, если ваш ввод не может содержать NUL-символов:
$ awk -v RS='\0' 'NR==FNR{gsub(/[^[:space:]]/,"[&]"); gsub(/[[:space:]]+/,"[[:space:]]+"); str=$0; next} {print gsub(str,"")}' str file
2
и так далее ...