1

У меня есть каталог с текстовыми файлами с разделителями табуляции, а некоторые содержат комментарии в первых нескольких строках, которые я хотел бы удалить. Я знаю, что первая хорошая строка начинается с "Mark", поэтому я могу использовать /^Mark/,$!d удалять эти комментарии. После этого у меня есть несколько других замен, которые я делаю в (новой) первой строке, которая имеет имена переменных.

Мой вопрос: почему я должен сохранить вывод sed , чтобы мой скрипт работал? Я понимаю, что если моя строка будет удалена, то вывод не будет продолжаться вниз, потому что нет вывода. Но если я не удаляю (то есть !d) тогда зачем мне сохранять в файл? Спасибо!

Вот мой сценарий оболочки. (Я sed новичок, так что любая другая обратная связь также оценена.)

#!/bin/bash
for file in *.txt; do
    mv $file $file.old1
    sed -e '/^Mark/,$!d' $file.old1 > $file.old2
    sed -e '1s/\([Ss]\)hareholder/\1hrhldr/g'\
        -e '1s/\([Ii]\)mmediate/\1mmdt/g'\
        -e '1s/\([Nn]\)umber/\1o/g'\
        -e '1s/\([Cc]\)ompany/\1o/g'\
        -e '1s/\([Ii]\)nformation/\1nfo/g'\
        -e '1s/\([Pp]\)ercentage/\1ct/g'\
        -e '1s/\([Dd]\)omestic/\1om/g'\
        -e '1s/\([Gg]\)lobal/\1lbl/g'\
        -e '1s/\([Cc]\)ountry/\1ntry/g'\
        -e '1s/\([Ss]\)ource/\1rc/g'\
        -e '1s/\([Oo]\)wnership/\1wnrshp/g'\
        -e '1s/\([Uu]\)ltimate/\1ltmt/g'\
        -e '1s/\([Ii]\)ncorporation/\1ncorp/g'\
        -e '1s/\([Tt]\)otal/\1ot/g'\
        -e '1s/\([Dd]\)irect/\1ir/g'\
        $file.old2 > $file
        rm -f $file.old*
done

2 ответа2

1

Нет необходимости сохранять стандартный вывод в файл. Вы можете направить (|) вывод к следующему процессу sed . Другой вариант заключается в использовании sed edit in place «s в опции место -i

От человека сед,

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if extension supplied) 
1

Использование sponge возможно самый безопасный способ перезаписи вашего входного файла. sponge правильно обрабатывает связанные ссылки на файл, sed -i - нет. см. эту ссылку: есть ли способ изменить файл на месте?

Тестовый файл

echo "comment
comment
Mark Global Ownership
Shareholder
Domestic
Last line" >test.txt
file=test.txt
cat "$file"
echo =====

Скрипт без цикла .. (Просто добавьте цикл)

sed -n '/^Mark/,${  # check for "first time"
          G         # append the hold space, looking for "\nX" 
          /\n$/{    # nothing in the hold space, so "first time"
            s/\n$// # remove \n introduced by G
            s/\([Ss]\)hareholder/\1hrhldr/g
            s/\([Ii]\)mmediate/\1mmdt/g
            s/\([Nn]\)umber/\1o/g
            s/\([Cc]\)ompany/\1o/g
            s/\([Ii]\)nformation/\1nfo/g
            s/\([Pp]\)ercentage/\1ct/g
            s/\([Dd]\)omestic/\1om/g
            s/\([Gg]\)lobal/\1lbl/g
            s/\([Cc]\)ountry/\1ntry/g
            s/\([Ss]\)ource/\1rc/g
            s/\([Oo]\)wnership/\1wnrshp/g
            s/\([Uu]\)ltimate/\1ltmt/g
            s/\([Ii]\)ncorporation/\1ncorp/g
            s/\([Tt]\)otal/\1ot/g
            s/\([Dd]\)irect/\1ir/g
            p           # print
            s/.*/X/; h  # set a "flag" in the hold space 
            b           # branch unconditionally (ie, next)
          };
          P;b   # print line (before "\nX") and branch            
        };d' "$file" | sponge "$file"

cat "$file"

Выход

comment
comment
Mark Global Ownership
Shareholder
Domestic
Last line
=====
Mark Glbl Ownrshp
Shareholder
Domestic
Last line

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .