Удалите строки с X по Y, используя Mac Unix Sed - PullRequest
0 голосов
/ 18 декабря 2018

Командная строка на Mac.Есть несколько текстовых файлов.Хотите удалить определенные строки из группы файлов, а затем добавить оставшийся текст файла в новый объединенный файл.В настоящее время предпринимаются следующие попытки:

for file in *.txt;
do echo $file >> tempfile.html;
echo ''>>tempfile.html;
cat $file>>tempfile.html; 
find . -type f -name 'tempfile.html' -exec sed -i '' '3,10d' {} +;
find . -type f -name 'tempfile.html' -exec sed -i '' '/<ACROSS>/,$d' {} +;
# ----------------
# some other stuff
# ----------------
done;

Я извлекаю часть текста из группы файлов и объединяю их все вместе, но все же необходимо знать, из какого файла происходил каждый выбор.Сначала я сопоставляю имя файла, а затем (предположительно) выделение текста из каждого файла.затем повторите процесс.

Кроме того, мне нужно оставить исходные текстовые файлы на месте для других целей.

Таким образом, объединенный файл будет иметь вид:

filename1.txt

text-selection
more_text

filename2.txt

even-more-text
text-text-test-test

Первый SED предполагается удалить из строки 3 в строку 10. Второй должен удалить из строки, содержащей до концафайл.

Однако, что происходит, то первый удаляет все в временном файле.Второй ничего не делал.(каждый тестировался отдельно)

Что я делаю не так?

Должно быть, я что-то упустил.Даже попытка - что кажется, - очень простой пример тоже не работает.Я надеюсь, что следующий пример удалит строки 3-10, но сохранит оставшуюся часть файла в test.txt.

sed '3,10d' nxd2019-01-06.txt > test.txt

1 Ответ

0 голосов
/ 18 декабря 2018

Ваш вызов find попытается запустить sed с максимально возможным количеством файлов за вызов. Но обратите внимание : адреса в sed делают не адресными строками в каждом входном файле, они адресуют весь ввод sed (который может состоять из множества входных файлов)

Попробуйте это:

> a.txt cat <<EOF
1
2
EOF

> b.txt cat <<EOF
3
4
EOF

Теперь попробуйте это:

sed 1d a.txt b.txt
2
3
4

Как видите, sed удалил первую строку из a.txt, а не из b.txt

Проблема в вашем случае, это второй вызов find.If удалит все из первого вхождения ACROSS до последней строки в последнем файле, найденном find Это эффективно удалит содержимое из всех, кроме первого tempfile.html .


Имея работающую оставшуюся логику в вашем скрипте, вы должны просто изменить вызовы find на:

find . -type f -name 'tempfile.html' -exec sed -i '' '3,10d' {} \;
find . -type f -name 'tempfile.html' -exec sed -i '' '/<ACROSS>/,$d' {} \;

Это вызовет sed один раз завходной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...