2016-11-04 4 views
1

Исходная строка (в соответствии с форматом мой)Удалить конкретный шаблон из строки в оболочке

"CF Foo -J 12345 -z -macro TEST_IFDEFINE -macro ЭТО -macro THIS1 -macro THIS2"

для того, чтобы передать его другому сценарию, я пытаюсь изменить его в

"сравни Foo -J 12345 -z"

Для достижения этой цели я написал скрипт следующим образом:

string="cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS -macro THIS1 -macro THIS2" 
done=0 
config="-cf" 
name="" 
for name in $string 
do 
    if [ $done -eq 1 ];then 
    string=`echo $string | sed s/"-macro"//g` 
    string=`echo $string | sed s/"$name"//g` 
    echo "----->name: $name" 
    macro_name="$macro_name -d $name" 
    done=0 
    echo "----->string: $string" 
    fi 
    if [ "$name" = "-macro" ];then 
    done=1 
    macro_def=1 
    fi 
done 

Из этого кода я получаю результат:

сравни Foo -J 12345 -z 1 2

Здесь $ name содержит THIS1 и THIS2. Но в сценарии, когда я делаю

| SeD с/"$ имя" // G`

удаляет только

'ЭТО'

Но держать

наряду с оригинальной строкой. Это означает, что скрипт отбрасывает только алфавиты, а не числовые значения в $ name. Предложите мне что-то достичь.

+1

Какова логика в чистке струны? Сохраните первые 5 слов? Все до макроса? – fedorqui

+0

Нет ... логика удаляет строку «-macro» и сопровождается именем макроса. В этом случае это «-macro THIS -macro THIS1 -macro THIS2» – ziga

ответ

2

Если вы хотите, чтобы удалить все блоки -macro WORD, просто так сказать:

$ sed 's/\s-macro \S*//g' <<< "cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS -macro THIS1 -macro THIS2" | cat -vet - 
cf foo -J 12345 -z$ 
  • \s-macro \S* матчи space + -macro + пробел + a word.
  • sed 's/something//g' удаляет это something столько раз, сколько встречается в строке.
+1

Не все диалоги 'sed' принимают регулярное выражение' '' Perl', но любое разумно современное 'sed' должно понимать синтаксис * de facto * [[: space:]] 'и ортогонально' [^ [: пространство:]] 'для' \ S'. – tripleee

2

С расширенными шаблонами вы можете использовать одно расширение параметра.

$ shopt -s extglob 
$ foo="cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS keepme -macro THIS1 -macro THIS2 keepme" 
$ echo "${foo//-macro +([[:alnum:]_])}?()" 
cf foo -J 12345 -z keepme keepme2 

+([[:alnum:]_]) соответствует одному или более букв, цифр или _, которые я предполагаю, что определение имени макроса. ?() удаляет необязательное конечное пространство после имени макроса. (Необязательно в том смысле, что окончательный -macro не будет иметь пробела после него.)

Смежные вопросы