После текущего конца -состояния «JACK начинается, если интерфейс установлен на hw :PCH или hw :PCH,0, но у меня нет никаких динамиков, кроме моего экрана, который находится на HDMI моей видеокарты, так что я не уверен, что в этом есть смысл». Я:
a2jmidid -j default
hw:PCH
Итак, моя оставшаяся проблема заключается в том, что она по-прежнему выдает ошибку в вопросе, когда я вместо этого пытаюсь направить JACK на выход HDMI -моей видеокарты. Поскольку у меня нет отдельных динамиков или других, не -встроенных -в -аудиовыход моего -монитора, это все еще проблема, поэтому я оставлю этот вопрос открытым.
Если файл длиннее, вот решение на основе awk
-, которое обрабатывает его построчно -мудро:
awk '/^[[:space:]]+username/ && !u_chng{sub(/:.+$/,": toto"); u_chng=1}
/^[[:space:]]+password/ && !p_chng{sub(/:.+$/,": totospw"); p_chng=1} 1' input.yml
Каждая строка будет проверяться, начинается ли она с username
или password
соответственно. Если это так, и связанные флаги u_chng
и p_chng
еще не установлены, он устанавливает значение после :
на новое желаемое и устанавливает соответствующий флаг, чтобы любые дальнейшие вхождения этих ключевых слов игнорировались.
Результат:
spring:
datasource:
url: url
username: toto
password: totospw
api:
security:
username:foo
password: foopwd
Обратите внимание: если вы используете реализацию awk
, которая не понимает классы символов ([[:space:]]
), измените
/^[[:space:]]+username/
-
/^[ \t]+username/
Если ваш файл достаточно мал и не помещается в памяти, вы можете попробовать прочитать его целиком как одну запись. Таким образом, sed
произведет замену только в первый раз, когда увидит шаблон в "строке" записи ():
$ sed -Ez 's/(username:)[^\n]*/\1toto/; s/(password:)[^\n]*/\1totopsw/' file.yaml
spring:
datasource:
url: url
username:toto
password:totopsw
api:
security:
username:foo
password: foopwd
Чтобы внести изменения в исходный файл, просто добавьте-i
:
sed -i -Ez 's/(username:)[^\n]*/\1toto/; s/(password:)[^\n]*/\1totopsw/' file.yaml
Другая sed
альтернатива:
sed '1,/username/{/username/ s/:.*/:toto/};
1,/password/{/password/ s/:.*/:totopsw/}' infile
1,/regex/
начать с первой строки вверх -до первой строки, совпавшей с заданнойregex
(здесь username
строка ), изменить "имя пользователя"; делаем то же самое для части «пароль».
Сgnu awk
awk -F '^\\s+|:' '
BEGIN {
a["username"] = "toto"
a["password"] = "totopsw"
}
($2 in a) {
sub(/:.*/, ": " a[$2])
delete a[$2]
};1
' file
если скрипт bash
действителен, вы можете использовать командуsed
quit
:
#!/bin/bash
sed -E '
# If we find an username
/username/ {
# make the sobstitution of the username
s/^([[:space:]]*username:)/\1toto/g
n # Take the next line with the password
# Sobstitute the password
s/^([[:space:]]*password:).*$/\1totopw/g
q1 # Quit after the first match
}
' test.yml > new_test.yml
# How many line we have taken
len_line=$(sed -n '$=' new_test.yml)
# write the other line
sed "1,${len_line}d" test.yml >> new_test.yml
# rename all the file
rm -f test.yml
mv new_test.yml test.yml