Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: barlopОтветов: 3
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 году.

command-linewindowscommand-promptsedgnu

Ответы

Ответ 1 · рейтинг 6 · paxdiablo

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

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 может обрабатывать этот синтаксис :-)

Ответ 2 · рейтинг 2 · gkolarov

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

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

Ответ 3 · ghostdog74

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

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

или просто

sed "s/a/ /g" file

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы