bash: источник: имя файла требуется аргумент источник: использование: исходное имя файла [аргументы] [закрыто]

sed предоставляет более простой способ:

... |  sed '/some stuff/ {N; s/^.*\n//; :p; N; $q; bp}' | ...

Таким образом вы удаляете первое вхождение.

Если вы хотите больше:

sed '1 {h; s/.*/iiii/; x}; /some stuff/ {x; s/^i//; x; td; b; :d; d}'

, где количество ] i - количество вхождений (одно или несколько, не ноль).

Многострочное объяснение

sed '1 {
    # Save first line in hold buffer, put `i`s to main buffer, swap buffers
    h
    s/^.*$/iiii/
    x
}

# For regexp what we finding
/some stuff/ {
    # Remove one `i` from hold buffer
    x
    s/i//
    x
    # If successful, there was `i`. Jump to `:d`, delete line
    td
    # If not, process next line (print others).
    b
    :d
    d
}'

Вдобавок

Вероятно, этот вариант будет работать быстрее, потому что он считывает все оставшиеся строки и печатает их за один раз

sed '1 {h; s/.*/ii/; x}; /a/ {x; s/i//; x; td; :print_all; N; $q; bprint_all; :d; d}'

В результате

Вы можете поместить этот код в свой .bashrc (или в конфиг вашей оболочки, если он другой):

dtrash() {
    if [ $# -eq 0 ]
    then
        cat
    elif [ $# -eq 1 ]
    then
        sed "/$1/ {N; s/^.*\n//; :p; N; \$q; bp}"
    else
        count=""
        for i in $(seq $1)
        do
            count="${count}i"
        done
        sed "1 {h; s/.*/$count/; x}; /$2/ {x; s/i//; x; td; :print_all; N; \$q; bprint_all; :d; d}"

    fi
}

И использовать его так:

# Remove first occurrence
cat file | dtrash 'stuff' 
# Remove four occurrences
cat file | dtrash 4 'stuff'
# Don't modify
cat file | dtrash
1
28.09.2017, 10:05
0 ответов

Теги

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