나는 이런 문자열을 가지고있다
/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
또는 \s
and (각각 "공백이 아닌" 문자와 "공백" 문자를 의미)를 이해하는 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