Основной вопрос SED для Linux - PullRequest
       6

Основной вопрос SED для Linux

0 голосов
/ 31 октября 2009

Временный файл содержит только число 22,5.

Я использую

sed 's/.//' Temp

и я ожидаю 225, но получаю 2,5

Почему?

Ответы [ 5 ]

7 голосов
/ 31 октября 2009

Точка - это специальный символ, означающий «соответствовать любому символу».

$ sed s/\\.// temp
225

Вы могли бы подумать, что могли бы сделать sed s/\.// temp, но ваша оболочка избежала этого одиночного обратного слеша и передала бы s/.// в sed. Итак, вам нужно поместить два обратных слеша для передачи буквального обратного слеша в sed, который будет трактовать \. как буквальную точку. Или вы можете заключить в кавычку команду для сохранения буквального обратного слеша:

$ sed "s/\.//" temp
225

Причина, по которой вы получаете 2,5, когда вы делаете s/.//, заключается в том, что точка соответствует первому символу в файле и удаляет его.

3 голосов
/ 31 октября 2009

Потому что '.' является регулярным выражением, которое соответствует любому символу. Вы хотите 's/\.//'

1 голос
/ 31 октября 2009

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

Вы хотите sed 's/\.//' Temp. Обратная косая черта используется для экранирования специальных символов, чтобы они возвращали свою номинальную стоимость.

0 голосов
/ 01 ноября 2009

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

awk '{sub(".","")}1' temp
0 голосов
/ 31 октября 2009

'' особенный: он соответствует любому отдельному символу. Так что в вашем случае выражение sed соответствует первому символу в строке. Попробуйте убежать так:

с /\.//

...