Удалить указанный c пробел назад с помощью sed - PullRequest
2 голосов
/ 19 июня 2020

Я пытаюсь удалить последний пробел в моей строке.

Ввод:

"hi guys how you doing"

Что я сейчас делаю:

$ echo "hi guys how you doing" | sed 's/ \+//1'

Текущий вывод:

"higuys how you doing"

Ожидаемый результат:

"hi guys how youdoing"

Эта строка, например, в моем приложении, я не знаю точного положения пробела, все, что я знаю, это то, что это в последней пустой позиции.

Знаете ли вы, существует ли какой-либо способ поиска в обратном направлении по строке без команды rev?

Ответы [ 4 ]

2 голосов
/ 19 июня 2020

Вы можете использовать

sed 's/\(.*[^[:space:]]\)[[:space:]]\{1,\}/\1/'
sed 's/[[:space:]]\{1,\}\([^[:space:]]*\)$/\1/'

Если ваш sed поддерживает \s, \S и если вы предпочитаете POSIX ERE, вы можете использовать

sed -E 's/(.*\S)\s+/\1/'
sed -E 's/\s+(\S*)$/\1/'

См. sed демонстрация :

s="hi guys how you doing"
sed 's/\(.*[^[:space:]]\)[[:space:]]\{1,\}/\1/' <<< "$s"
# => hi guys how youdoing

Подробности

  • \(.*[^[:space:]]\)[[:space:]]\{1,\} / (.*\S)\s+ соответствует и записывается в Группу 1 любого нуля или более символов, насколько это возможно, до последнего непробельного пространства и соответствует 1 или более пробелам после него
  • [[:space:]]\{1,\}\([^[:space:]]*\)$ / \s+(\S*)$ соответствует 1+ пробелам, а затем совпадает и захватывает в Группу 1 ноль или более символы без пробелов в конце строки.
1 голос
/ 20 июня 2020

С bash и регулярным выражением:

x="hi guys how you doing"
[[ "$x" =~ (.*)\ (.*) ]] && echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]}"

Вывод:

hi guys how youdoing
1 голос
/ 20 июня 2020
$ echo "hi guys how you doing" | sed 's/\(.*\) /\1/'
hi guys how youdoing
1 голос
/ 20 июня 2020

это должно работать. он соответствует одиночному пробелу , за которым следует последовательность непробельных символов в конце строки \([^ ]*\)$, и заменяет его \1 последовательностью непробельных символов (следовательно, отбрасывает совпадающий пробельный символ):

echo "hi guys how you doing" | sed 's/ \([^ ]*\)$/\1/g'

печатает hi guys how youdoing

обновление: изменено регулярное выражение, чтобы удалить только самый последний, одиночный пробел символ, как предлагается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...