Считайте Файл пословно

Для быстрого применения текстового преобразования в текущей директории можно использовать конструкции 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 остаётся для читателя упражнением.

0
09.04.2015, 18:16
7 ответов

Это зависит от того, как вы определяете слова.

Если слова разделены одним или несколькими пробелами, вы можете сделать:

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_].

2
28.01.2020, 02:17

Вы получите список «слов», которые были разделены пробелами, но с пунктуацией пунктуации прилагаются:

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 или и т. Д., И Читать строка по линии.

0
28.01.2020, 02:17

Только

while read -ra line; 
do
    for word in "${line[@]}";
    do
        echo "$word";
    done;
done < test.txt

разделит файл слово за словом. Измените echo на то, что вы хотите сделать со словами.

добавлены точки с запятой, так что это можно поместить в один лайнер.

2
28.01.2020, 02:17

Проще говоря, используя пробел в качестве сепаратора и все остальное как слово,

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.

, если это слова содержат пунктуации и пунктуации, это слова, не вызывают много проблем, которые вы можете попробовать так.

1
28.01.2020, 02:17

Учитывая, что в своем вопросе вы использовали 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 принимает имена входных файлов в качестве аргументов.

0
28.01.2020, 02:17

Я написал следующий пример скрипта, который читает файл /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
0
28.01.2020, 02:17
read -a WORDS -d "" < file.txt
for word in "${WORDS[@]}"
do
        echo $word
done

Опция -a сохраняет слова в массиве.

Опция -d определяет строку разделителя. Это сообщает read, где остановить обработку файла. Я указал пустую строку, которая заставляет чтение продолжаться до тех пор, пока не будет получен EOF. То есть обрабатывается весь файл независимо от окончания строки.

0
28.01.2020, 02:17

Теги

Похожие вопросы