как разбить строку по вкладке в bash

test1="one  two three   four    five"
echo $test1 | cut -d $'\t' -f2

У меня есть строка, разделенная TAB, и я хочу получить второе слово с помощью команды cut.

Я нашел вопрос Как разделить строку в bash, разделенные табуляцией. Но решение не используется с cut.


person biubiubiu    schedule 15.10.2014    source источник


Ответы (4)


Это происходит потому, что вам нужно заключать $test1 в кавычки, когда вы echo:

echo "$test1" | cut -d$'\t' -f2

В противном случае формат исчезает, а табуляции преобразуются в пробелы:

$ s="hello      bye     ciao"
$ echo "$s"              <--- quoting
hello   bye ciao
$ echo $s                <--- without quotes
hello bye ciao
person fedorqui 'SO stop harming'    schedule 15.10.2014

Вам не нужен cut и вы можете сохранить себе вилку:

$ test1=$(printf "one\ttwo\three\tfour\tfive")
$ read _ two _ <<< "${test1}"
$ echo "${two}"
two
person Adrian Frühwirth    schedule 15.10.2014
comment
test1="one two three four five" из OP было достаточно, чтобы определить переменную, нет необходимости printf. Кроме того, в этом случае {} в "${test1} не нужны. - person fedorqui 'SO stop harming'; 15.10.2014
comment
Это зависит от правильности настройки IFS для вкладок, поэтому, если вы изменили это ранее, например, на разорвать новые строки, вы должны установить его снова, т.е. IFS=$'\t' read ... - person Andris; 09.01.2020

Попробуйте использовать cut без опции -d:

echo "$test1" | cut -f2

Ниже приведен эксперт из cut справочной страницы:

-d, --delimiter=DELIM
    use DELIM instead of TAB for field delimiter 
person Fazlin    schedule 15.10.2014
comment
на самом деле я пробовал это, и результатом также является вся строка test1. - person biubiubiu; 15.10.2014
comment
Проверьте отредактированный пост. Я заключил $test1 в двойные кавычки. - person Fazlin; 15.10.2014
comment
Вы пробовали echo $test1 отдельно? Я не вижу табуляции в выходной строке... Лучше использовать t="one\tthwo\tthree";echo -e $t|cut -f2 или даже t="one\tthwo\tthree";printf $t|cut -f2. Чао - person gboffi; 15.10.2014
comment
@gboffi проблема в самих кавычках. Как только вы не используете их в echo, формат теряется. - person fedorqui 'SO stop harming'; 15.10.2014
comment
@fedorqui - извините, но я не заметил вашего ответа. я только что проверил свой код и обновил. - person Fazlin; 15.10.2014

Я запускаю это:

test1="one;two;three;four;five"

echo $test1 | cut -d \; -f2

и получить:

two

и ваш пример:

test1="one  two three   four    five"

echo $test1 | cut -d \t -f2

и получить:

wo

Надеюсь, что это полезно.


Я думаю, это проблема \t.

person Love77    schedule 15.10.2014
comment
Вы установили разделитель как «t» (экранирование не имело никакого эффекта). Исходя из этого, второе поле действительно «wo». - person Gary_W; 15.10.2014