Сам Bash (фактически оболочка POSIX) предоставляет все, что вам нужно, через расширение параметра с удалением подстроки .Все, что вам нужно сделать, это проверить, совпадает ли прочитанная вами строка с удаленным префиксом.Если это не так, у вас есть строка с префиксом, в противном случае, у вас есть строка без префикса.Тогда достаточно просто вывести строку без префикса и установить префикс для текущей строки - и повторить, например,
#!/bin/bash
pfx= ## prefix
## read each line
while read -r line; do
## if no prefix or line matches line with prefix removed
if [ -z "$pfx" -o "$line" = "${line#$pfx}" ]
then
printf "%s\n" "$line" ## output lile
pfx="$line" ## set prefix to line
fi
done < "$1"
( примечание: , если есть вероятностьчто во входном файле, который не содержит конца файла POSIX, например, '\n'
в последней строке файла, вы должны проверить содержимое строки как условие вашего while
, например, while read -r line || [ -n "$line" ]; do ...
)
Пример входного файла
$ cat string.txt
a/
a/b/c/
a/d/
bar/foo/
bar/foo2/
c/d/
c/d/e/
Пример использования / Вывод
$ bash nonprefix.sh string.txt
a/
bar/foo/
bar/foo2/
c/d/