2017-01-15 4 views
0

Я пытаюсь одну линию следующих рабочих команду, чтобы запустить его в Баш:одиночные CMD линии СЭД Mac OSX эль Capitan

LANG=C sed -E ' 
s/$/\\z/ 
:while 
s/([0-9]{6})(.*\\z.*)/\2 "\1"/ 
twhile 
s/.*\\z//' myfile.txt 

образец для myfile.txt:

123456 \ г \ п \ г \ п 789112 \ г \ п 889667

выход выше CMD (который является ожидаемым RESU л):

"123456", "789112", "889667"

ни это:

LANG=C sed -E 's/$/\\z/; :while; s/([0-9]{6})(.*\\z.*)/\2 "\1"/; twhile; s/.*\\z//' myfile.txt 

выход:

123456 \ г \ п \ г \ n 789112 \ r \ n 889667 \ z

или это на самом деле работает:

LANG=C sed -E 's/$/\\z/' -E :while -E 's/([0-9]{6})(.*\\z.*)/\2 "\1"/;twhile' -E 's/.*\\z//' myfile.txt 

выход:

СЭД: -E: Нет такого файла или каталога

СЭД:: в то время как: Нет такого файла или каталога

sed: -E: Нет такого файла или каталога

sed: s/([0-9] {6}) (. \ z.)/\ 2 "\ 1" /; twhile: Нет такого файла или каталога

СЭД: -E: Нет такого файла или каталога

СЭД: s /.* \ г //: Нет такого файла или каталог

123456 \ г \ п \ г \ п 789112 \ г \ п 889667 \ г

в результате, как отображать один и только строку файла вместо множественного экземпляра шаблона/[0-9] {6}/

Я считаю, что я пропустил g что-то о том, как использовать точку с запятой.

+0

Какая ошибка вы получаете? – 123

+0

Оба отображают только одну строку файла вместо нескольких экземпляров шаблона/[0-9] {6} /. Пропущенный этот пункт в сообщении, спасибо;) – user2702566

+0

Можете ли вы предоставить образец ввода и вывода? – 123

ответ

1

sed предназначен для простых подстановок на отдельных линиях, то есть для всех. То, что вы пытаетесь сделать, это не так, поэтому вы не должны пытаться использовать sed для этого. Пока не ясно, что вы пытаетесь сделать, но это он:

$ awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' file 
"123456" 
"789112" 
"889667" 

что использует GNU AWK для мульти-гольцов RS и \s стенография для [[:space:]].Выше был запущен на этом входном файле:

$ cat -v file 
123456 ^M 
^M 
789112 ^M 
889667 

Что я и думаю, что вы пытаетесь выразить с помощью публикуемую ввода пробы:

$ printf '123456 \r\n \r\n 789112 \r\n 889667' | 
    awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' 
"123456" 
"789112" 
"889667" 

или, если вы предпочитаете, чтобы искать соответствующие строки, а чем пробелы, которые отделяют строки:

$ printf '123456 \r\n \r\n 789112 \r\n 889667' | 
    awk -v RS='[0-9]{6}' '{print "\"" RT "\""}' 
"123456" 
"789112" 
"889667" 
+0

Большое спасибо за вашу помощь. Мой файл представляет собой одну строку, которая действительно выглядит следующим образом: «123456 \ r \ n \ r \ n 789112 \ r \ n 9667'. Я начал с awk, но не смог найти правильный способ сделать это, поэтому я попробовал sed ... Но кажется, что я ошибаюсь в отношении того, какой инструмент использовать между sed и awk ... – user2702566

+0

Но по определению, если он содержит '\ r \ n' - это не одна строка, так как строки заканчиваются на' \ r \ n' в Windows и '\ n' в UNIX, так что в любом случае появляются новые строки. Если вы не имеете в виду, это буквально содержит 4 символа «обратная косая черта r обратная косая черта n». –

+0

Линия - это ответ запроса на завиток на сервер, и ответ сервера - это json с значениями \ r \ n в нем (что глупо ... но у меня нет никакого контроля над ним, я просто пытаюсь для синтаксического анализа ответа ...) – user2702566

 Смежные вопросы

  • Нет связанных вопросов^_^