Добавление текста в конец строки с помощью сценария sed - shell - PullRequest
0 голосов
/ 06 июля 2019

У меня есть простой сценарий оболочки, который я почти работаю по желанию.

Требования:

  • Считать имена файлов в директории dir в массив
  • переберите файлы и добавьте текст в конец соответствующей строки

Однако пока все достигнуто, я не могу заставить sed правильно добавить строку.

Например, вот мой сценарий:

#!/bin/bash

shopt -s nullglob
FILES=(/etc/openvpn/TorGuard.*)
TMPFILES=()

if [[ ${#FILES[@]} -ne 0 ]]; then
    echo "####### Files Found #######"
    for file in "${FILES[@]}"; do
        echo "Modifying $file.."
        line=$(grep -n "auth-user-pass" "$file" | cut -d: -f -1)
        array=($(sed -e $line's/$/ creds.txt &/' "$file"))
        tmp="${file/.conf/.ovpn}"
        echo "$tmp created.."
        TMPFILES+=("$tmp")
        printf "%s\n" "${array[@]}" > ${tmp}
    done
fi

Ожидаемый результат:

....
....
auth-user-pass creds.txt
...
...

Полученный вывод:

...
...
auth-user-pass
creds.txt
...
...

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

sed может быть сложно со специальными символами. В этом случае вы можете использовать &, что будет заменено на завершенную совпадающую строку.

for file in "${FILES[@]}"; do
    echo "Modifying ${file}.."
    sed -i 's/.*auth-user-pass.*/& creds.txt/' "${file}"
done
0 голосов
/ 06 июля 2019

Решил проблему, изменив флаг sed с -e> -i, исключив использование файлов tmp и сделав это с помощью sed:

#!/bin/bash

shopt -s nullglob
FILES=(/etc/openvpn/TorGuard.*)

if [[ ${#FILES[@]} -ne 0 ]]; then
    echo "####### Files Found #######"
    for file in "${FILES[@]}"; do
        echo "Modifying $file.."
        line=$(grep -n "auth-user-pass" "$file" | cut -d: -f -1)
        sed -i $line's/$/ creds.txt &/' "$file"
    done
fi
...