Для быстрого применения текстового преобразования в текущей директории можно использовать конструкции PWD
переменной и расширения параметров .
cd ${PWD/parent1/parent2}
Это не обязательно должен быть именно компонент пути, это может быть любая подстрока. Например, если пути буквально parent1
и parent2
, и далее в пути не осталось ни одного символа 1
, вы можете использовать cd ${PWD/1/2}
. Строка поиска может содержать несколько компонентов пути, но тогда вам нужно будет избежать косой черты. Например, чтобы перейти от ~/checkout/ trunk/doc/frobnicator/widget
к ~/checkout/bugfix/src/frobnicator/widget
, можно использовать cd ${PWD/trunk\/doc/bugfix/src}
. Точнее, часть parent1
представляет собой шаблон шаблона оболочки, так что вы можете написать что-то вроде cd ${PWD/tr*c/bugfix/src}
.
В zsh можно использовать более короткий синтаксис cd parent1 parent2
. Опять же, вы можете заменить любую подстроку в пути (здесь, это именно подстрока, а не шаблон подстановки).
Вы можете реализовать аналогичную функцию в bash.
cd () {
local options
options=()
while [[ $1 = -[!-]* ]]; do options+=("$1"); shift; done
if (($# == 2)); then
builtin cd "${options[@]}" "${PWD/$1/$2}"
else
builtin cd "${options[@]}" "$@"
fi
}
Zsh обеспечивает завершение второго аргумента. Реализация этого в bash остаётся для читателя упражнением.
Это зависит от того, как вы определяете слова.
Если слова разделены одним или несколькими пробелами, вы можете сделать:
tr -s '[:blank:]' '[\n*]' < file |
while IFS= read -r word; do
: echo "$word" here
done
Если слова являются последовательностями символов, содержат A-Z
, a-z
и _
:
tr -cs 'A-Za-z_' '[\n*]' < file | ...
В исторических системах V системы необходимо использовать квадратные скобки [A-Za-z_]
.
Вы получите список «слов», которые были разделены пробелами, но с пунктуацией пунктуации прилагаются:
while read -a tmp_var;
do
for i in "${tmp_var[@]}"
do
var[${#var[*]}=$i
done
done < test.txt
, но, как обычно, TEXT.TXT
был преобразован By TR
или SED
или и т. Д. В списке «1 слово в строке» по TR
или SED
или и т. Д., И Читать
строка по линии.
Только
while read -ra line;
do
for word in "${line[@]}";
do
echo "$word";
done;
done < test.txt
разделит файл слово за словом. Измените echo
на то, что вы хотите сделать со словами.
добавлены точки с запятой, так что это можно поместить в один лайнер.
Проще говоря, используя пробел в качестве сепаратора и все остальное как слово,
set -o noglob
words=($(cat text_file)) # use split+glob operator with glob disabled
# above. Splits on space tab and newline with
# the default value of $IFS.
, если это слова содержат пунктуации и пунктуации, это слова, не вызывают много проблем, которые вы можете попробовать так.
Учитывая, что в своем вопросе вы использовали awk
, вот еще одна альтернатива tr
и fmt
:
awk '{ for ( i = 1; i < NF; ++i ) print $(i); }' test.txt | while IFS= read -r var do echo processing: "$var" done
Обратите внимание, что, как и в случае с fmt
и в отличие от tr
, awk
принимает имена входных файлов в качестве аргументов.
Я написал следующий пример скрипта, который читает файл /etc/passwd
слово за словом.
#!/bin/bash
COUNT=1
FCOUNT=`cat /etc/passwd|wc -l`
while [ $COUNT -le $FCOUNT ]
do
FTCOUNT=`awk -F ":" '{print NF,$0}' /etc/passwd|awk '{print $1}'|head -$COUNT|tail -1`
TCOUNT=1
while [ $TCOUNT -le $FTCOUNT ]
do
if [ $TCOUNT -gt $FTCOUNT ]
then
FTCOUNT=""
break
else
OUTPUT=`head -$COUNT /etc/passwd|cut -d ":" -f $TCOUNT|tail -1`
echo -n "${OUTPUT} "
sleep 2
TCOUNT=$(( TCOUNT + 1 ))
fi
done
echo ""
COUNT=$(( COUNT + 1 ))
done
read -a WORDS -d "" < file.txt
for word in "${WORDS[@]}"
do
echo $word
done
Опция -a сохраняет слова в массиве.
Опция -d определяет строку разделителя. Это сообщает read, где остановить обработку файла. Я указал пустую строку, которая заставляет чтение продолжаться до тех пор, пока не будет получен EOF. То есть обрабатывается весь файл независимо от окончания строки.