Удалить слово, длина которого меньше 2 в bash - PullRequest
2 голосов
/ 11 декабря 2010

Я использую bash на CentOS 5.5.У меня есть строка, разделенная пробелом, и строка содержит только алфавиты и цифры, и эта строка может иметь дополнительный пробел, например, между "words" и "string":

$exmple= "This is a lovey 7 words   string"
* более одного пробела1005 * Я хочу удалить слово, длина которого меньше 2, в этом примере необходимо удалить слова "a" и "7".И удалите все лишние пробелы, только один пробел между одним словом и другим.

, чтобы строка стала:

"This is lovey words string"

Ответы [ 4 ]

4 голосов
/ 11 декабря 2010

sed делает это красиво:

example="This is a lovey 7 words string"
echo $example | sed -e 's/ [a-zA-Z0-9]\{1\} / /g'
4 голосов
/ 11 декабря 2010

Редактировать (на основе ответа sed от ennuikiller)

Использование чистого Bash:

newstring=${exmple// ? / }   # remove one character words

Для нормализации пробела:

read newstring <<< $newstring

или

shopt -s extglob
newstring=${newstring//+( )/ }

Оригинал:

exmple="This is a lovey 7 words   string"
for word in $exmple
do
    if (( ${#word} >= 2 ))
    then
        newstring+=$sp$word
        sp=' '
    fi
done
0 голосов
/ 10 июня 2014

awk также может сделать это:

$ awk '{for (i=1; i<=NF; i++) s=(length($i)>2? s($i)FS : s); print s}' <<< "This is a lovey 7 words   string"
This lovey words string 

Объяснение

Идея состоит в том, чтобы перебрать все поля строки, хранящие те, которые больше заданного размера.Наконец, распечатайте сохраненную строку.

  • for (i=1; i<=NF; i++) переберите все поля.
  • s=(length($i)>2? s($i)FS : s), если длина слова больше 2, затем добавьте его к текущейпредложение.В противном случае, нет.
  • print s выведите окончательную строку.
0 голосов
/ 13 декабря 2010

sed -e 's/ [a-zA-Z0-9] / /g' не удалит двойные или более пробелов.

Это будет:

echo "This is a lovey 7 words   string" | sed 's/ [a-zA-Z0-9 ] / /g'

И это удалит все пробелы в начале или в конце:

echo "   This is a lovey 7 words   string  " | sed 's/ [a-zA-Z0-9 ] / /g' | sed 's/^ *\| *$//g'
...