У мене є текстові файли, які містять стовпчики, розділені різною кількістю пробілів, але замість цього мені потрібна одна вкладка як роздільник. Чи можна це робити в Баші?
У мене є текстові файли, які містять стовпчики, розділені різною кількістю пробілів, але замість цього мені потрібна одна вкладка як роздільник. Чи можна це робити в Баші?
Відповіді:
Щоб конвертувати послідовності з декількох пробілів у вкладку, а окремі пробіли залишити в спокої :
sed 's/ \+ /\t/g' inputfile > outputfile
Для цього для декількох файлів:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
або
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
або
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
що внизу.
sed
не любить місця перед розширенням резервного копіювання. Я відредагував свою відповідь. Дякуємо за звіт.
Якщо у вашого персонажа кілька вкладок, ви також можете використовувати tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
Наприклад:
my_file.txt | tr -s " "
Усі білі простори стануть цілими.
Можна sed
замінити ряд пробілів на вкладку .:
Приклад заміни одного або декількох пробілів однією вкладкою:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
Найпростіша відповідь, що використовується лише bash
:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
Якщо є змінна кількість стовпців, ви можете це зробити, але це буде працювати лише в bash
, а не sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
напр
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
виробляє:
a b c
d e f
g h i
(Між кожним є вкладка, але важко помітити, коли я вставляю її сюди)
Ви також можете це зробити, використовуючи sed
або tr
, але зауважте, що обробка заготовок на старті дає різні результати.
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
perl -p -i -e 's/\s+/\t/g' *.txt
Це дуже просте рішення:
sed -E 's/\s+/\t/g' your_file > new_file
sed в основному працює таким чином (sed 's / old_pattern / new_pattern / g'). У цьому випадку старий шаблон є "\ s +", що означає знаходити простір "s" один чи більше разів "+", а зворотний косий рядок "\" інтерпретувати це як регулярний вираз.
Новим шаблоном є вкладка "\ t", яка записується у форматі регулярного вираження, а "g" застосовується заміна до всіх рядків "глобально".