стирая с помощью sed - PullRequest
       4

стирая с помощью sed

1 голос
/ 02 марта 2012

У меня есть тонны строк в файле, и я хочу знать, может ли sed стереть то, что есть после столбца

например, изменив это:

a20 is (on) Jan 15

для:

a20 is (on)

Ответы [ 6 ]

3 голосов
/ 02 марта 2012

Есть несколько способов сделать это. Если вы хотите удалить все в каждой строке, после скобок просто используйте:

sed -i 's/).*/)/' file.txt

То, что сделано выше, это «сопоставить все после круглых скобок и заменить все совпадения только круглыми скобками».

Как говорится, самый простой инструмент, как правило, правильный. cut предоставляет очень простой способ "разрезать" линию на блоки, основываясь на delimiter, который вы ей передаете. Например:

cut -d" " -f -3 file.txt

Теперь, если ваш файл немного отличается, а третий столбец не обязательно заканчивается круглыми скобками, вы можете использовать awk. Awk обеспечивает намного больший контроль и более детализирован, чем cut.

Например:

awk -F' ' '{ print $1, $2, $3 }' file.txt

То, что сделано выше, разделяет каждую строку, используя символ, переданный с -F в качестве разделителя полей. Затем он печатает три первых поля, разделяя их одним и тем же разделителем полей (OFS).

3 голосов
/ 02 марта 2012

Вместо этого вы можете попробовать вырезать:

cut -d " " -f -3 FILENAME
1 голос
/ 02 марта 2012

awk - инструмент, который очень хорошо работает с табличными данными:

$ awk -v n=4 '{for(i=n;i<=NF;i++)$i=""}1' file.txt

cut - еще один инструмент (иногда вам нужносжать пробелы с tr до cut):

$ cat file.txt | tr -s ' ' | cut -d ' ' -f 1-3
0 голосов
/ 02 марта 2012

Никто не упомянул путь perl (который в отличие от sed -i работает на платформах, не использующих GNU sed): perl -p -i -e 's/(on).*/(on)/' filename

0 голосов
/ 02 марта 2012

Это может работать для вас:

echo "a20 is (on) Jan 15" | sed 's/\(\s*\S*\)\{2\}$//'
a20 is (on)

работать в обратном направлении иногда проще или вперед:

echo "a20 is (on) Jan 15" | sed 's/\(\S*\(\s*\S*\)\{2\}\).*/\1/'
a20 is (on)
0 голосов
/ 02 марта 2012

Да, вы можете использовать sed:

sed 's/^\([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*\).*/\1/' file.txt > newfile.txt

Добавьте переключатель "-i" после sed и (в bash) файл будет редактироваться на месте (т.е. ввод и вывод одинаковы),Сначала сделайте резервную копию во время тестирования.

В некоторых версиях sed вы можете использовать расширенные регулярные выражения, что делает синтаксис более дружелюбным.Используйте переключатель «-r»:

sed -r 's/^([^ ]+ [^ ]+ [^ ]+).*/\1/' file.txt > newfile.txt

[^ ] означает все символы, кроме пробела.[^ ]* означает ноль или более любого символа, кроме пробела [^ ]+ означает один или несколько любых символов, кроме пробела \1 означает замену первым выражением в скобках. Конечно, вы всегда можете использовать вместо него сокращение :-):

cut -f-3 -d" " file.txt > newfile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...