Tamam, genel bir çözüm. Aşağıdaki bash işlevi 2k
bağımsız değişkenler gerektirir ; her çift bir yer tutucu ve bir yedek parçadan oluşur. Dizeleri fonksiyona geçirmek için uygun şekilde alıntı yapmak size kalmıştır. Bağımsız değişken sayısı tekse, son yer tutucunun oluşumlarını etkili bir şekilde silen örtük bir boş bağımsız değişken eklenir.
Tutucuları ne de değiştirmeler Ne boş karakter olabilir, ancak standart C kullanabilir \
gibi -escapes \0
sen ihtiyaç olduğuna NUL
lar (ve dolayısıyla yazmayı gerekli olan \\
bir isterseniz \
).
Posix benzeri bir sistemde (lex ve cc) bulunması gereken standart oluşturma araçlarını gerektirir.
replaceholder() {
local dir=$(mktemp -d)
( cd "$dir"
{ printf %s\\n "%option 8bit noyywrap nounput" "%%"
printf '"%s" {fputs("%s", yyout);}\n' "${@//\"/\\\"}"
printf %s\\n "%%" "int main(int argc, char** argv) { return yylex(); }"
} | lex && cc lex.yy.c
) && "$dir"/a.out
rm -fR "$dir"
}
\
Gerekirse argümanlarda zaten kaçtığını varsayıyoruz, ancak varsa çift tırnaktan kaçmamız gerekiyor. İkinci baskının ikinci argümanı budur. Yana lex
varsayılan eylemdir ECHO
, bunu endişe gerekmez.
Örnek çalışma (şüpheci için zamanlamalar ile; sadece ucuz bir emtia dizüstü bilgisayar):
$ time echo AB | replaceholder A B B A
BA
real 0m0.128s
user 0m0.106s
sys 0m0.042s
$ time printf %s\\n AB{0000..9999} | replaceholder A B B A > /dev/null
real 0m0.118s
user 0m0.117s
sys 0m0.043s
Daha büyük girişler için bir optimizasyon bayrağı sağlamak yararlı olabilir cc
ve mevcut Posix uyumluluğu için kullanılması daha iyi olur c99
. Daha da iddialı bir uygulama, oluşturulan yürütülebilir dosyaları her seferinde oluşturmak yerine önbelleğe almaya çalışabilir, ancak bunların oluşturulması tam olarak pahalı değildir.
Düzenle
Eğer varsa tcc , geçici bir dizin oluşturma güçlük önlemek ve normal büyüklükteki girdilere yardımcı olacaktır hızlı derleme zaman geçirebilir:
treplaceholder () {
tcc -run <(
{
printf %s\\n "%option 8bit noyywrap nounput" "%%"
printf '"%s" {fputs("%s", yyout);}\n' "${@//\"/\\\"}"
printf %s\\n "%%" "int main(int argc, char** argv) { return yylex(); }"
} | lex -t)
}
$ time printf %s\\n AB{0000..9999} | treplaceholder A B B A > /dev/null
real 0m0.039s
user 0m0.041s
sys 0m0.031s
tr AB BA
.