Подтвердить что ты не робот

Удалите определенную строку с tr

Можно ли удалить определенную строку с помощью команды tr в UNIX-Shell? Например: если я набираю:

tr -d "1."

а вход 1.1231, в качестве вывода будет отображаться 23, но я хочу, чтобы он показывал 1231 (уведомление прошло только первый 1). Как мне это сделать?

Если вы знаете решение или лучший способ, объясните синтаксис, так как я не хочу просто копировать и вставлять, но и узнавать.

У меня большие проблемы с awk, поэтому, если вы используете это, объясните это еще больше.

4b9b3361

Ответ 1

В вашем примере выше команда cut будет достаточной.

Пример: echo '1.1231' | cut -d '.' -f 2 вернет 1231.

Для получения дополнительной информации о вырезать просто введите man cut.

Ответ 2

Вам было бы лучше использовать какое-то регулярное выражение (может быть, что-то вроде sed).

Например, с входом 1.1231 вы можете использовать следующее для вывода 1231:

sed 's/1\.//g'

Возможно, посмотрите здесь: http://tldp.org/LDP/abs/html/string-manipulation.html

Ответ 3

Вы также можете использовать sed для такого рода вещей:

$ echo "1.1231" | sed -e "s/1\.//"
1231

Это просто использование sed для запуска поиска регулярных выражений и замены, заменяя "1." (с соответствующим экранированием) с помощью "". Он по умолчанию удаляет первое совпадение.

Ответ 4

Если вы используете bash, вы можете сделать это легко с помощью замены параметров:

$ a=1.1231
$ echo ${a#1.}
1231

Это приведет к удалению ведущей строки "1.". Если вы хотите удалить до и включая первое вхождение, используйте ${a#*1.}, и если вы хотите удалить все до и включая последнее вхождение, используйте ${##*1.}.

Страница TLDP на строковая манипуляция содержит дополнительные параметры (например, извлечение подстроки).

Обратите внимание, что использование стандартных инструментов sh для управления строкой для таких простых преобразований всегда будет намного быстрее, чем использование внешнего инструмента, такого как sed, awk или cut, потому что оболочка не необходимо создать подпроцесс для выполнения операции. Однако для более сложных вещей (например, вам нужно использовать регулярные выражения или когда вход большой), лучше использовать выделенные инструменты.

Ответ 5

Поскольку вы специально задали вопрос о awk, вот еще один.

awk '{ gsub(/1\./,"") }1' input.txt

Как расскажет вам любой учебник awk, общий вид программы awk - это последовательность "condition {actions}". Если у вас нет действий, действие по умолчанию - печать. Если у вас нет условий, действия будут приняты безоговорочно. Эта программа использует оба этих особых случая.

Первая часть - это действие без условия, т.е. оно будет принято для всех строк. Действие заключается в том, чтобы заменить все вхождения регулярного выражения /1\./ на ничего. Таким образом, это обрезает любой "1". (независимо от контекста) из строки.

Вторая часть - это условие без действия, то есть оно будет печататься, если условие истинно, и условие всегда истинно. Это распространенная идиома: "мы закончили - печатаем все, что у нас есть". Он состоит просто из константы 1 (которая при использовании в качестве условия означает "истина", просто).

Это можно было бы переформулировать несколькими способами. Например, вы можете включить печать в первое действие,

awk '{ gsub(/1\./,""); print }'  input.txt

Возможно, вы захотите подставить целую часть, то есть любые числа до знака периода. Регулярное выражение для этого будет чем-то вроде /[0-9]+\./.

gsub является расширением GNU, поэтому вы можете заменить его на sub или какой-то цикл, если вам нужна переносимость в устаревший синтаксис awk.