문자열에서 패턴과 일치하는 모든 단어를 제거합니다.

문자열에서 패턴과 일치하는 모든 단어를 제거합니다.

나는 이런 문자열을 가지고있다

/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

여기서는 포함된 모든 단어를 제거하고 싶습니다 /usr/bin/. 단어는 공간이 분리되어 있음을 의미합니다.

따라서 /usr/bin/gjs/usr/bin/com.github.johnfactotum.Foliate삭제됩니다.

결과 출력은 다음과 같습니다/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

지금까지 내가 시도한 것은 다음과 같습니다.

MY_COMMAND_PATH="/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub"

WORD_TO_REMOVE="/usr/bin/gjs "

if [[ $MY_COMMAND_PATH == "/usr/bin/gjs "* ]]; then
    MY_COMMAND_PATH=${MY_COMMAND_PATH//$WORD_TO_REMOVE/}
fi

WORD_TO_REMOVE="/usr/bin/com.github.johnfactotum.Foliate "

if [[ $MY_COMMAND_PATH == "/usr/bin/gjs "* ]]; then
    MY_COMMAND_PATH=${MY_COMMAND_PATH//$WORD_TO_REMOVE/}
fi

하지만 이는 확장 가능하지 않습니다. 처음 두 단어를 제거하는 것과 같은 솔루션은 나에게도 효과가 없었습니다(이것은 예이며 극단적인 경우가 있습니다). 나에게 필요한 정확한 논리는 " /usr/bin/다음을 포함하는 문장인 모든 단어를 제거" 하는 것입니다.

답변1

간단한 perl 명령을 사용하여 이 작업을 수행할 수 있습니다.

$ string="/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub"
$ printf -- '%s\n' "$string" | perl -pe 's|\S*/usr/bin/\S*\s*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

\S또는 \sand (각각 "공백이 아닌" 문자와 "공백" 문자를 의미)를 이해하는 sed를 사용할 수도 있습니다.

$ printf -- '%s\n' "$string" | sed -E 's|\S*/usr/bin/\S*\s*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

그렇지 않은 것도 있습니다:

$ printf -- '%s\n' "$string" | /sed 's|[^[:blank:]]*/usr/bin/[^[:blank:]]*[[:blank:]]*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

관련 정보