Удаление табуляции из строки с помощью функции sed или awk и tcl regsub

Скажем, у меня есть строка как name = xyz здесь после имени есть табуляция, а после '=' произвольное количество пробелов.

Мне нужен вывод как name=xyz

Итак, как я могу удалить как вкладки, так и случайное количество пробелов из вышеупомянутой строки, используя функцию sed или awk и tcl regsub. Помощь высоко ценится. Спасибо.

Я пытался

[regsub -all { +} $str ""]

Это удаляет случайное количество пробелов из $str, но вкладки все еще присутствуют.

Несмотря на то, что команда tr не была одной из упомянутых вами опций, это может быть самый простой способ решить проблему, если она у вас есть. Передача ввода через tr -d '[:blank:]' удалит все пробелы (включая повторяющиеся символы), сохраняя при этом новые строки и переводы строк.

radical7 12.04.2023 07:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
135
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

\s соответствует как символу табуляции, так и пробелу. Тогда не могли бы вы попробовать:

[regsub -all {\s+} $str ""]

Потенциальная проблема здесь в том, что он удалит пустые символы в любом месте, независимо от отношения к знаку =.

Безопаснее будет сказать:

[regsub {\t=\s*} $str " = "]

который удаляет символ табуляции перед = и пробелы после =.

Немного проще: regsub {\s*=\s*} $str " = " -- не нужно ничего захватывать.

glenn jackman 12.04.2023 16:08

Кроме того, если есть странная строка, такая как set str "name\t= foo\t\t= bar", ваше регулярное выражение заменит последнее = (из-за жадного начального .+), а мое заменит первое.

glenn jackman 12.04.2023 16:11

@glennjackman спасибо за предложение. Я обновил ответ соответственно.

tshiono 13.04.2023 01:37

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

Himanshu_Pandey 14.04.2023 02:36

Спасибо за ваш отзыв! Приятно знать, что это работает. Если вы считаете, что мой ответ хорошо решает вашу проблему, я был бы признателен, если бы вы могли принять мой ответ, нажав на галочку рядом с ответом. БР.

tshiono 14.04.2023 03:08
Ответ принят как подходящий

Вот также решение с использованием sed

myvar=$(sed -E 's/\s*=\s*/=/g' <<<$myvar)

или, чтобы быть более портативным, вы можете использовать [[:space:]] вместо \s

myvar=$(sed -E 's/[[:space:]]*=[[:space:]]*/=/g' <<<$myvar)

Здесь каждое вхождение =, окруженное любым количеством пробельных символов, будет заменено только = без каких-либо пробелов.

Я бы использовал GNU AWK для этой задачи следующим образом

echo "name    = xyz" | awk 'BEGIN{OFS = ""}{$1=$1;print}'

дает результат

name=xyz

Объяснение: GNU AWK предполагает, что разделителем полей является один или несколько пробельных символов, которые соответствуют вашему варианту использования, я установил OFS на пустую строку, поэтому между полями ничего не будет, $1=$1 запускает перестройку строки, print печатает ее. Если вы хотите узнать больше о OFS, прочитайте 8 мощных встроенных переменных Awk — FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

(проверено в GNU Awk 5.0.1)

Использование замены параметра bash:

$ str='name    = xyz'
$ str = "${str//[ \t]/}"
$ echo "$str"
name=xyz

# or

$ str='name    = xyz'
$ str = "${str//[[:space:]]/}"
$ echo "$str"
name=xyz

Другое решение с awk:

echo 'name    = xyz' | awk NF++ OFS=

Результаты в

name=xyz

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

Mark Rotteveel 13.04.2023 12:18

@MarkRotteveel: просто в посте под моим уже есть ссылка на объяснение того, для чего нужны NF и OFS. Вы хотите, чтобы я продублировал это? или мне тоже нужно объяснять ++ ? На самом деле, мое решение - это наименее подробный способ выразить то, что Давео сказал ниже, с очень тонкой разницей - мое решение пропускает пустые строки, ее/его/ее версия распечатывает их. @Общее недовольство: я просто предпочитаю стиль четко разграничивать входные данные теста и результирующие выходные разделы из самого кода.

RARE Kpop Manifesto 13.04.2023 16:06

Да, вы должны сделать свой ответ как можно более полным с достаточным количеством информации, чтобы понять ваше решение.

Mark Rotteveel 13.04.2023 16:21

@MarkRotteveel: определить достаточно. Могу ли я предположить, что у них есть минимальное понимание того, что означает stdin, или мне нужно также включить учебник по unix?

RARE Kpop Manifesto 15.04.2023 02:12

Пожалуйста, прочтите это перед повторным откатом.

General Grievance 15.04.2023 02:48

@GeneralGrievance: и все же мой первоначальный макет визуально разграничил ввод, код и вывод, так что избыточное многословие, такое как «Результаты в», не нужно. Вы можете относиться к другим людям по-своему, но не клевещите и не клевещите на меня, применяя эти снисходительные и покровительственные заголовки разделов, как если бы они исходили из моих уст. Наверное, нужно снова включить Оби-Вана в мой быстрый набор.

RARE Kpop Manifesto 15.04.2023 10:27

Вы неправильно визуально обрисовали код. Когда вы используете блок-цитаты, вы говорите, что это сказал другой источник, см. рекомендации по ссылкам. Поскольку это не было намерением, редактирование для удаления было оправдано. На столе есть много действительных вариантов того, что вы намеревались сделать, я только что предложил один. Вы также можете редактировать. Только не злоупотребляйте форматированием.

General Grievance 15.04.2023 22:28

Удивительно, но этому вопросу уделялось много внимания. Итак, вношу свой взгляд на задачу. В Tcl вместо использования regsub вы можете использовать внутренний синтаксический анализатор списка, чтобы отбрасывать разделительные символы:

join [list {*}$str] ""

Это, безусловно, зависит от того, полностью ли вы контролируете входную строку. Он должен соответствовать допустимому строковому представлению списка Tcl.

Другие вопросы по теме