Sed в Vista - как удалить все символы между? - PullRequest
2 голосов
/ 08 января 2009

У меня есть bat-файл, который я должен использовать, чтобы удалить часть одного файла и сохранить в другой. Мне нужно удалить все символы между текстом "[aaa bbb]" и "[ccc ddd]". Это если у меня есть текст:

[aaa bbb]
1
2
3
[ccc ddd]

Я должен иметь в качестве вывода:

[aaa bbb]
[ccc ddd]

Спасибо

РЕДАКТИРОВАТЬ: Я хотел бы уточнить вопрос. Я должен удалить все символы между marker1 и marker2. Marker1 и marker2 - это просто некоторые слова или части текста, но не обязательные строки. Например, у меня будет:

[aaa bbb] [ccc]
1
2
3
4
5
[www yyy]

Если я хочу удалить текст между [aaa bbb] и [www yyy], у меня должен быть вывод:

[aaa bbb] 
[www yyy]

Ответы [ 5 ]

2 голосов
/ 09 января 2009

Взгляните на раздел "Удалить между маркером 1 и маркером 2" на эта страница подсказок sed

Применение его на вашем примере. clean.sed

/^\[aaa bbb\]$/,/^\[ccc ddd\]$/{
 /^\[aaa bbb\]$/!{
   /^\[ccc ddd\]$/!d
 }
}

Выполнить с помощью:

sed -f clean.sed inputfile.txt

Чтобы редактировать входной файл "на месте", используйте опцию -i для sed:

sed -i.bak -f clean.sed datafile.txt

Резервная копия файла с именем «datafile.txt.bak» сохраняется перед редактированием оригинала.

РЕДАКТИРОВАТЬ: Поскольку предположение, что маркеры всегда были на отдельной строке, было неправильным, вот сценарий, который может обрабатывать маркеры в середине строки:

/\[aaa bbb\]/,/\[ccc ddd\]/{
  s/\[aaa bbb\].*/[aaa bbb]/
  s/.*\[ccc ddd\]/[ccc ddd]/
  /\[aaa bbb\]$/!{
    /^\[ccc ddd\]/!d
  }
}

Для этого ввода:

foo[aaa bbb]1
2
3
4
5[ccc ddd]bar
foo
[aaa bbb]
1
2
3
[ccc ddd]
bar

производит:

foo[aaa bbb]
[ccc ddd]bar
foo
[aaa bbb]
[ccc ddd]
bar

Примечание! Он не может обрабатывать файлы, в которых маркеры могут появляться в одной строке.

Снова отредактируйте: Если формат ввода для маркера 1 таков, что вы всегда можете рассчитывать на то, что он находится на отдельной строке, вы можете несколько упростить скрипт:

/^\[aaa bbb\]$/,/\[ccc ddd\]/{
  s/.*\[ccc ddd\]/[ccc ddd]/
  /^\[aaa bbb\]$/!{
    /^\[ccc ddd\]/!d
  }
}

(Закрепление маркера 1 в начале и конце строки и пропуск обрезки строки маркера 1).

1 голос
/ 09 января 2009
D:\tmp\sed.exe -f sedscript.sed D:\tmp\test.txt >c:\tmp\test2.txt


/^\[Product Feature\]$/,/^\[Dm$/{
 /^\[Product Feature\]$/!{
 /^\[Dm$/!d 
 }
 } 
1 голос
/ 09 января 2009

Обратите внимание, что sed доступно для Windows вместе с целой связкой других утилит GNU. Я не уверен, спрашиваете ли вы, есть ли эквивалент или как на самом деле сделать это, когда у вас есть инструмент.

0 голосов
/ 09 января 2009

Если вы доверяете сценарию VB "sed-like" из , этот ответ ...

sed.vbs:

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

Вы можете набрать
cscript /Nologo sed.vbs s/^\d+\s*$/ < in.txt (исходный текст - in.txt)

и вы получите ожидаемый результат ...

^\d+\s*$

Нацелен на любую строку, начинающуюся с одной или нескольких цифр, за которой следуют 0 или более пробелов в одной строке.


Это не лучшее решение "pure sed", и оно не может фактически удалить строки, но это нативное "совместимое с Vista" решение ...


На самом деле, следующий хак, преднамеренно интерпретирующий "d sed-command", мог бы "удалить" строки:

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  out = rxp.Replace(inp, patparts(2))
  if not patparts(2)="d" or not out="d" Then
    WScript.Echo out
  end if
Loop

cscript /Nologo sed.vbs s/^\d+\s*$/ < in.txt фактически произведет:

[aaa bbb]
[ccc ddd]

В .bat у вас может быть sed.bat:

cscript /Nologo sed.vbs %1 < %2

и затем выполните этот .bat так:

C:\prog\sed>sed.bat s/^\d+\s*$/d in.txt
0 голосов
/ 09 января 2009

Я посмотрел на cmd и на Power Shell - не могу найти ничего полезного. Получить себе ActivePerl?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...