GNU sed - найти или заменить пробелы или новые строки.Почему это не работает?v3.02 против v4.2 - PullRequest
2 голосов
/ 26 июля 2010
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

Попытка заменить '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.Это более актуально.Теперь я могу указать пробелы.И кончик призрака, и paxdiablo, я вижу о двойных кавычках.Я в порядке, указывая пробелы с \ d (начиная с версии 4.2) или с пробелом.Но я все еще не могу удалить новые строки

C: \ crp> type ff |sed -e "s / \ r \ n / f / g"

aa

bb

cc

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

aa

b bb

cc

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

aa

b bb

c cc

Ответы [ 3 ]

5 голосов
/ 26 июля 2010

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

sed -e 's/a/ /g'

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

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

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

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

sed -e "s/a/ /g"

В противном случае экранирующий символ в Windows - ^, поэтому что-то вроде этого должно быть в состоянии экранировать пробел:

sed -e s/a/^ /g

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

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

tr -d "\n"

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

2 голосов
/ 12 декабря 2012

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

Состояния версии Sed: GNU sed версия 4.0.7

0 голосов
/ 26 июля 2010

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

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

или просто

sed "s/a/ /g" file
...