Как получить часть строк из всех .txt файлов в каталоге?

я нашел решение своей проблемы на переполнение стека . Таким образом:

Согласно это ридми , systemd, по-видимому, требует опция CONFIG_FHANDLE ядра. После перекомпиляции с этой включенной опцией, монтируя разделы хорошо работал снова.

Для людей, использующих , делают menuconfig, опция находится под Общая установка : enter image description here

0
23.05.2017, 15:40
2 ответа

Насколько я понимаю, вы хотите изменить серию файлов на месте. Вы хотите удалить все, включая первую строку, которая состоит из всего из Abstract . Если эти файлы находятся в текущем каталоге и все названы с расширением .txt , используйте:

sed -i '0,/^Abstract$/d' *.txt

Так как это перезапишет старые файлы и в случае, если что-то пойдет не так, не используйте это без имея резервную копию.

Для этого может потребоваться GNU sed (стандартная для Linux).

Как это работает

  • -i

    Параметр -i указывает sed редактировать файлы на месте. Старый файл будет перезаписан.

  • 0, / ^ Abstract $ / d

    Эта команда сообщает sed удалить ( d ) все строки с первой (номер 0) до первой включительно строка, соответствующая регулярному выражению ^ Abstract $ . Каретка ^ соответствует началу строки, а знак доллара соответствует ее концу. Таким образом, это регулярное выражение соответствует строке, содержащей только , слово Abstract с без других символов в строке.

  • *. Txt

    Указывает оболочке выбрать все файлы в текущем каталоге с суффиксом .txt .

Обновление

Это приведет к удалению всех строк в каждом файле до первой строки, которая начинается с Аннотация :

sed -i '0,/^Abstract/d' *.txt

Поскольку $ был удален, это регулярное выражение требует только, чтобы строка начиналась с Abstract .

1
28.01.2020, 02:36

Использование sed :

sed -ni.bak '/^Abstract/,$p' *.txt

Получить все строки, которые начинаются с ^ с Abstract в , end $ ] файла и сохраните копию исходного файла с именем *. txt.bak , используя параметр sed -i .

С awk :

awk '/^Abstract/,0' *.txt

Если вы хотите, чтобы это было также для подкаталога, используйте команду с командой find следующим образом:

find /path/to/main-dir -type f -name "*.txt" -exec  sed -ni.bak '/^Abstract/,$p' '{}';

Это намного лучше, если у вас есть новый строка в именах файлов:

find /path/to/main-dir -type f -name "*.txt" -print0 | while IFS= read -d '' -r file
do
    sed -ni.bak '/^Abstract/,$p' "$file";
done

В данном решении ( find -name * txt -type d -exec sed -i '0, / ^ Abstract / d' * .txt {} \; ) в В теле вашего вопроса вы ищете каталоги ( -тип d , используемый для поиска каталогов), имена которых заканчиваются на txt , если у вас нет каталога с таким же именем, как ] * txt , тогда ваша часть -exec не запустится. Таким образом, вы ничего не делаете с этой командой.

Таким образом, вам нужно изменить * txt -type d на «*. Txt» -type f (это означает все файлы * .txt -type f ) и заключите их в кавычки, если в именах ваших файлов есть пробелы. Также вам необходимо удалить *. Txt из конца команды sed , потому что '{}' в команде find указывает на текущий найденный файл и цитирует его тоже. Даже было бы лучше, если бы вы указали путь для поиска в команде. Наконец, ваша проверенная команда будет иметь следующий вид:

find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;
1
28.01.2020, 02:36

Теги

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