GNU sed — найти или заменить пробелы или новые строки. Почему это не работает? v3.02 против v4.2

C:\crp\cnp>sed -V

GNU sed version 3.02

Copyright (C) 1998 Free Software Foundation, Inc.......


C:\crp\cnp>type f.f

a a a

a a a

Пытаюсь заменить "а" пробелами.

C:\crp\cnp>type f.f | sed -e s/a/\d032/g

d032 d032 d032

d032 d032 d032

почему это не работает?

Я не возражаю, нахожу ли я или заменяю пробелы или новые строки. Я просто хочу указать их. Кажется, он не работает, и я не знаю, почему.

(Замена пробелов или пробела на f не работает)

C:\crp\cnp>echo a a | sed s/\d32/f/
a a

Примечание. Кажется, это может работать в 4.2, но меня интересует 3.02, потому что это версия, связанная с unxutils http://unxutils.sourceforge.net/

Обновление вопроса - спасибо за подсказку paxdiablo .. о gnu32win, теперь я использую его вместо unxutils. Это более актуально. Теперь я могу указать пробелы. И наконечник ghostdog, и paxdiablo, я вижу про двойные кавычки. Я могу указывать пробелы с помощью \d (начиная с версии 4.2) или с пробелом. Но я все еще не могу удалить новые строки

C:\crp>тип f.f | sed -e "s/\r\n/f/g"

a aa

b bb

c cc

C:\crp>тип f.f | sed -e "s/\d013\d010/f/g"

a aa

b bb

c cc

C:\crp>тип f.f | sed -e "s/\x0D\x0A/f/g"

a aa

b bb

c cc

Примечание. Этот вопрос был из 2010 года. Сейчас на дворе 2020 год. Gnuwin32 устарел (последнее обновление Gnuwin32 sed было в 2010 году, а Sed 4.2.1 – 2009 года), Unxutils – еще больше устарел. Таким образом, Gnuwin32 на момент написания устарел на десять лет, а Unxutils устарел на два десятилетия по состоянию на 2020 год. Cygwin по-прежнему обновляется, и на момент написания используется Sed v 4.4, выпущенный в 2017 году.


person barlop    schedule 26.07.2010    source источник


Ответы (3)


Почему бы вам просто не использовать сам пробел, а не какую-то забавную кодировку? Как в:

sed -e 's/a/ /g'

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

sed -e 's/a/\d032/g'

Извините, я только что заметил, что вы используете Windows, поэтому у вас, вероятно, есть CygWin или GnuWin32 (или эквивалент).

В Windows кавычки работают по-другому, поэтому попробуйте две вещи. Первый — использовать " вместо ' кавычек:

sed -e "s/a/ /g"

В противном случае escape-символом в Windows является ^, поэтому что-то вроде этого должно иметь возможность избежать пробела:

sed -e s/a/^ /g

Кроме того, я бы по возможности переключился на GnuWin32, в котором есть более свежие версии sed (например). Не похоже, чтобы UnxUtils обновлялся с 2003 года на основе той веб-страницы, на которую вы ссылаетесь. Вы можете получить отдельные пакеты здесь. Вы ищете coreutils, который содержит большую часть набора инструментов для обработки текста UNIX.

Но если вы застряли с UnxUtils, я бы просто использовал фактический пробел, а не десятичный код, а затем использовал бы tr, чтобы избавиться от новых строк:

tr -d "\n"

при условии, конечно, что tr в textutils может обрабатывать этот синтаксис :-)

person paxdiablo    schedule 26.07.2010
comment
команда, которую вы дали, не работает в 3.02 C:\crp\cnp›echo a a | sed -e 's/a/g' ВЫДАЕТ ОШИБКУ sed: -e выражение #1, char 1: Неизвестная команда: ``''' - person barlop; 26.07.2010
comment
И эта вторая команда с \d032, где вы сказали, что она не работает в 4.2.1, но будет работать, если вы поставите кавычки. Я обнаружил, что это работает в 4.2 и не работает, когда я делаю, как вы, и ставлю кавычки `(обратная кавычка) или '(одинарная кавычка). - person barlop; 26.07.2010
comment
@barlop, вы, кажется, пропустили / перед g. Но в любом случае, я только что заметил, что вы используете Windows, которая является немного другим зверем с точки зрения оболочки, так что смотрите обновление. - person paxdiablo; 26.07.2010
comment
Пример s/a//g сработал... хотя есть идеи, почему \d032 не работает в версии 3.02? (это происходит в версии 4.2, с кавычками или без них). В версии 3.02 C:\crp\cnp›echo a a | sed -e s/a/\d032/g ДАЕТ d032 d032 - person barlop; 26.07.2010
comment
Понятия не имею, возможно, \d появился после 3.02. Попробуйте \x20 и посмотрите, работает ли это. - person paxdiablo; 26.07.2010
comment
Кроме того, я не вижу, как удалить новые строки. Причина, по которой я хотел использовать \d032 для указания пробела, заключалась в том, что я могу указать любые символы, включая, например, новые строки, что было одной из вещей, которые я хотел попытаться удалить. - person barlop; 26.07.2010
comment
Ну... может быть, я просто скачаю unxutils, затем установлю sed 4.2 и не буду использовать sed 3.02. - person barlop; 26.07.2010
comment
Я хотел бы иметь возможность указать новые строки в sed.. и удалить их или заменить чем-то. Он мощнее, чем TR. См. обновление к вопросу, есть примеры, которые не работают - person barlop; 26.07.2010
comment
ОК .. Я нашел это .. объясняющее, почему у SED есть проблемы с новыми строками stackoverflow.com/questions/1251999/ И, согласно этой следующей ссылке, EOF - это еще один (возможно, только для Windows). Таким образом, специальные символы / управляющие символы обычно являются или могут быть проблемой sourceforge.net /projects/gnuwin32/forums/forum/74807/topic/ Итак, это то, для чего sed не годится, и люди используют TR или TR и SED. (и, возможно, cat перед TR, хотя cat всегда может быть ненужным). - person barlop; 27.07.2010
comment
также, как уже упоминалось ... полезный совет от paxdiaglo ... использовать gnuwin32, а не unxutils, unxutils устарела - старые версии программ. В gnuwin32 почти наверняка есть все, что есть в unxutils. - person barlop; 27.07.2010

Я застрял с той же проблемой в Win XP, и двойные кавычки не работали при попытке напечатать новую строку «\ n». Решение состояло в том, чтобы использовать новый UnxUpdates.zip из http://unxutils.sourceforge.net/. Он работает правильно с "\n".

Версия Sed гласит: GNU sed версии 4.0.7

person gkolarov    schedule 12.12.2012
comment
Сейчас я использую gnuwin32. unxutils удобно ставить(просто зип бинарников), если кому нежелательно лень но оно того не стоит! gnuwin32›unxutils. unxutils старый. gnuwin32 имеет гораздо больше. gnuwin32 имеет sed 4.2.1, поэтому он новее, чем unxupdates.zip. Также однажды у меня были проблемы с wget с unxutils, gnuwin32 был в порядке как более новая версия wget. см. мой ответ здесь, чтобы узнать больше о superuser. ком/вопросы/168202/ - person barlop; 12.12.2012

В окнах используйте двойные кавычки

sed "s/a/\d032/g" file

или просто

sed "s/a/ /g" file
person ghostdog74    schedule 26.07.2010
comment
очень правильно насчет этих двойных кавычек! второй работает отлично. Но первый (который может не требовать кавычек) не работает в v3.02 C:\crp\cnp›echo a a | sed -e s/a/\d032/g ВЫДАЕТ d032 d032 (хотя отлично работает в 4.2 с кавычками или без них). Кажется, сбой в версии 3.02 - person barlop; 26.07.2010