Jak znaleźć i zamienić ciąg danych w pliku tekstowym

1

Chciałbym móc przeanalizować plik tekstowy zawierający dane, takie jak:

2014-08-06 18:06:15 e:\shared\filename1.Shared orphan entry BM-100
2014-08-06 18:46:15 e:\shared\filename222.Shared orphan entry BM-214
2014-08-06 18:53:15 e:\shared\filename92.Shared orphan entry BM-674

To jest w systemie Windows i chciałbym móc uruchomić skrypt pliku wsadowego, aby usunąć ciąg daty i tekst po rozszerzeniu .shared. Jakieś pomysły?

użytkownik354113
źródło

Odpowiedzi:

0

Potrzebujesz narzędzia uniksowego sed , które obsługuje edycję wyrażeń regularnych i jest dostępne w wielu wersjach systemu Windows (wystarczy poszukać sed.exe ). Jeśli przekażesz nazwę pliku do pliku wsadowego, powinien on zawierać coś takiego:

sed <"%1" 's/\.Shared .*$'//|sed 's/^.* .* //' >"%1.mod"

Spowoduje to usunięcie każdej linii od „ .Shared ” do końca linii, a następnie od początku linii do drugiego pustego miejsca, i zapisuje wynik w przekazanej nazwie pliku z dołączonym .mod .

Możesz oczywiście usunąć jedno lub oba przekierowania i zamiast tego przekierować dane wejściowe i / lub wyjściowe po wywołaniu pliku wsadowego.

AFH
źródło
Istnieją oczywiście bardziej eleganckie rozwiązania, z jednym wezwaniem do sed , ale pomyślałem, że te dwa wezwania sprawiły, że działania były nieco jaśniejsze - grymoire.com/unix/sed.html powie ci wszystko, co musisz wiedzieć o sed, jeśli chcę lepszego polecenia.
AFH,
0

Jeśli korzystasz z systemu Windows Vista lub nowszego, możesz użyć programu PowerShell

(gc D:\input.txt) | % {$_ -replace "2014", "xxx"} | sc D:\input.txt
  • gc myPath Alias ​​dla Get-Content do odczytu w pliku
  • | przeciągnij tekst do następnego polecenia
  • () należy użyć lub plik wejściowy jest nadal otwarty, gdy chcesz go zapisać
  • % { ... } Alias ​​dla obiektu ForEach, który przechodzi przez każdą linię
  • -replace LookFor, ReplaceWith zastępuje twój ciąg
  • sc myPath Alias ​​dla Set-Content, aby zapisać nową zawartość z powrotem na tę samą ścieżkę

Dalsza lektura

nixda
źródło
0

Za pomocą tego skryptu python (który jest wbudowany w większość dystrybucji Linuksa i jest łatwą instalacją dla systemu Windows):

import sys

if __name__ == "__main__":
    input_file = sys.argv[1]
    output_file = sys.argv[2]

    with open(input_file) as fp:
        with open(output_file, 'w') as fp_w:
            for line in fp:
                fp_w.write("{}\n".format(line.split(' ')[2]))

Otrzymasz ten wynik:

e:\shared\filename1.Shared
e:\shared\filename222.Shared
e:\shared\filename92.Shared

Kroki tworzenia skryptu python:

  1. utwórz plik o nazwie parser.py(lub jakkolwiek chcesz go nazwać)
  2. skopiuj powyższy kod do pliku
  3. uruchom następujące polecenie:

    python parser.py test.txt test_output.txt

    Zakłada się, że test.txtjest to plik wejściowy i test_output.txtścieżka do pliku, w którym chcesz zapisać wyniki.

James Mertz
źródło
0

Wiersz polecenia systemu Windows

for /f "tokens=2-3"   %i in (x.txt) do echo %i %j

prowadzi do

18:53:15 e:\shared\filename92.Shared

(lub)

for /f "tokens=3"   %i in (x.txt) do echo %i

skutkować w

e:\shared\filename92.Shared
cybernard
źródło