Jak mogę usunąć tekst przed separatorem w systemie Linux


16

Muszę usunąć tekst z linii przed separatorem.

Na przykład:

(123434): hello::{apple,orange,mango}.

Najpierw muszę usunąć tekst :. tj (123434).

Czy w Linuksie jest jakieś polecenie do wykonania tego zadania?


Możesz zajrzeć do sedlubawk
Paul

Czy ten tekst jest częścią pliku, czy częścią zmiennej bash?
Bernhard,

To jest część pliku.
user80538,

Odpowiedzi:


14

To sedpolecenie powinno załatwić sprawę. Następujące polecenie zastąpi plik:

sed -i 's/^[^:]*:/:/' file

Aby tylko wydrukować wynik, usuń -iflagę. Aby umieścić dane wyjściowe w nowym pliku, usuń -iflagę i przekieruj dane wyjściowe:

sed 's/^[^:]*:/:/' file > new_file

Linia zrobiła magię ... dane wyjściowe zostały zastąpione w samym pliku ..
user80538

kiedy porównuję dwa pliki za pomocą sdiff, po usunięciu tekstu z obu plików, różnica pokazuje mi usunięty tekst. to polecenie zastępuje plik lub po prostu pokazuje wynik.
user80538,

Udało się .. Czy mogę wyodrębnić „hello” i {apple, orange, mango} z mojego przykładu, wprowadzając proste zmiany w powyższym poleceniu?
user80538,

@ user80538, Trudno powiedzieć, co chcesz, kiedy wypowiadasz wyciąg w tym kontekście. Czy to część większego skryptu powłoki? Możesz zadać nowe pytanie ze szczegółami większego problemu, który próbujesz rozwiązać.
drs

To tylko proste porównanie dwóch plików z tymi samymi danymi, ale wystarczy tylko znaleźć, gdzie dane różnią się w dwóch plikach. Muszę sprawdzić każdą sekcję w linii. Dane w poszczególnych sekcjach mogą się zbierać. jak {jabłko, mango, mango} może być {jabłko, mango, pomarańcza}.
user80538,

14

Możesz użyć cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Możesz to zrobić za pomocą dość prostej instrukcji Bash :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

To zostanie wydrukowane : hello::{apple,orange,mango}.. Możesz wycinać przedrostki i przyrostki w podobny sposób. Ponadto definicje prefiksów i sufiksów mogą zawierać symbole wieloznaczne.

Wytnij prefiks - dopasuj do znaku wieloznacznego pierwszego prefiksu: ${variable#prefix}

Wytnij prefiks - dopasowanie do znaku wieloznacznego do ostatniego prefiksu: ${variable##prefix}

Wytnij sufiks - do pierwszego dopasowania symboli wieloznacznych: ${variable%suffix}

Wytnij przyrostek - do ostatniego dopasowania wieloznacznego przyrostka: ${variable%%suffix}

Na pierwszy rzut oka może wydawać się niejasny, patrz następujący przykład:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

W ostatnim przykładzie wzór nie pasuje, więc nic nie jest wycinane.


Byłby bardziej niezawodny w użyciu echo ${mytext#*:}:. To odpowiednio obsłuży linie takie jak (123)(434): hello::{apple,orange,mango}.i 123434: hello::{apple,orange,mango}.
drs

czy jest jakiś sposób zmodyfikować echo polecenia $ {mytext %% B *}, aby otrzymać tekst po B. w twoim przykładzie
80538,

@ user80538 tak, po prostu wytnij tekst przed B, włącznie ;-), tj .: $ {mytext # * B} dla tekstu po pierwszym B i $ {mytext ## * B} dla tekstu po drugim B.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.