2015-05-14 3 views
0

Как мы можем сопоставить любое слово в тексте ввода, а затем заменить его на replaceString. Например, . Я хотел бы, чтобы команда sed соответствовала любому слову во входном тексте и заменяла каждый из них «XXX».sed любое слово поиск и замена

эхо "бар смущения рекомендуется" | СЕПГ «Пожалуйста, заполните правильный ответ здесь»

Я хотел бы вывод, как это

XXX XXX XXX

Я новичок в linux.So там могут быть некоторые другие команды, которые могут работать лучше здесь, в этой ситуации Любая рекомендация?

Определение слова в этом вопросе очень просто. Он может содержать алфавиты a-z или A-Z, подчеркивание. И любые два слова ограничены пробелом.

примеры

"это образец текста" "Это образец текста" "this_ is_ a_ sample_ _Текст"

+0

'sed 's/please_fill_your_regexp_here/XXX/g" ' –

+0

Ответы до сих пор предполагают, что слово с делением переносится на два слова. Признавая, что особый случай и обращение с ним по-разному очень сложно в sed, и вряд ли это будет необходимо. Но вы должны знать о предположении. – mpez0

+1

Что такое слово в вашем контексте?Слово '17'? «Это слово или слово?» Как насчет 'as-is'? Являются ли слова ВСЕГДА разделены пробелами? Должны ли символы без слов быть оставлены как есть или удалены или заменены пробелами? Вы заботитесь о сохранении пробела между словами? Измените свой вопрос, чтобы определить слово «word», и включите несколько многословных строк ввода сэмпла, которые, по вашему мнению, будут сложны для правильного сценария и связанного с ним вывода. –

ответ

1

matchew's helpful answer содержитsed решения GNU, которое необходимо, учитывая, что ваш вопрос помечен .

В комментарии, вы говорите, что вы находитесь на Mac (OS X), который поставляется с BSDsed, который ведет себя по-разному во многих отношениях.

POSIX-совместимый (и, таким образом, кросс-платформенный) эквивалент команды matchew в является:

echo "Bar Embarrassment Recommended." | sed 's/[[:alnum:]_]\{1,\}/XXX/g' 

Однако, обратите внимание, что это будет соответствовать словам на любую границу, а не только пробельных; то есть пробег словных символов, соединенных , любой символ не-слова будет соответствовать, так что abc-de превратится в XXX-XXX, например.

+0

Отлично! команда кросс-платформы работает круто. – brownfox

2

EDIT:

echo "Bar Embarrassment Recommended." | sed -r 's/\w+/XXX/g' 

является то, что вы после , Ваша потребность просто преобразовать полное слово в 3 X не была ясна после моего первоначального чтения вашего вопроса.

+0

Выше команда возвращает this.XXX XXXXXXXXXXXXX XXXXXXXXXXX, но мне нужно, чтобы это было как XXX XXX XXX, где ни один из XXX не равен ни одному из слов во входном тексте – brownfox

+0

нет ничего плохого в исходном вопросе (ну, недостаток усилий, может быть,) .. Я имею в виду, это кристально чисто ... –

+0

@Phaneendra Я имею в виду почти, но это пунктуация сохраняется. Это то, о чем вы просили? Заменить буквы с помощью X? О, ваш комментарий отредактирован. Хорошо, я понимаю, что вы сейчас имеете в виду. – matchew

-1

вы можете сопоставить любое целое слово по границе слова, как это:

 echo "bar embarrassment recommended" | sed 's/\b\S\+\b/XXX/g'
+0

Ничего не меняет. – Jotne

+0

да. это не – brownfox

+2

Метасимвол '+' должен быть экранирован i.e '\ +', если не был вызван переключатель '-r'. Также метасимволы '\ b' не нужны, так как' \ S' означает любой символ, который не является пробелом, а дополнением '\ s'. – potong

0

Вы можете использовать awk. Он заменяет все слова xxx

echo "bar embarrassment recommended" | awk '{for (i=1;i<NF;i++) printf "xxx ";print "xxx"}' file 
xxx xxx xxx 
+0

Это заменяет все пробеги _non-whitespace_ символов, что не совсем то же самое, что и запрос OP. Кроме того, он нормализует пробелы, что может быть или не быть желательным. – mklement0