一個轉換花引號的 gawk 腳本
我管理著一個個人網站,用手工編輯網站上的網頁。由於網站上的頁面並不多,這種方法對我很適合,可以讓我對網站代碼的細節一清二楚。
最近我升級了網站的設計樣式,我決定把所有的普通引號都轉換成「花引號」,即在列印材料中使用的那種引號:用 「」 來代替 ""。
手工修改所有的引號太耗時了,因此我決定將這個轉換所有 HTML 文件中引號的過程自動化。不過通過程序或腳本來實現該功能需要費點勁。這個腳本需要知道何時將普通引號轉換成花引號,並決定使用哪種引號(LCTT 譯註:左引號還是右引號,單引號還是雙引號)。
有多種方法可以轉換引號。Greg Pittman 寫過一個 Python 腳本 來修正文本中的花引號。而我自己使用 GNU awk (gawk) 來實現。
開始之前,我寫了一個簡單的 gawk 函數來評估單個字元。若該字元是一個引號,這該函數判斷是輸出普通引號還是花引號。函數查看前一個字元;若前一個字元是空格,則函數輸出左花引號。否則函數輸出右花引號。腳本對單引號的處理方式也一樣。
function smartquote (char, prevchar) {
# print smart quotes depending on the previous character
# otherwise just print the character as-is
if (prevchar ~ /s/) {
# prev char is a space
if (char == "'") {
printf("‘");
}
else if (char == """) {
printf("“");
}
else {
printf("%c", char);
}
}
else {
# prev char is not a space
if (char == "'") {
printf("’");
}
else if (char == """) {
printf("”");
}
else {
printf("%c", char);
}
}
}
這個 gawk 腳本的主體部分通過該函數處理 HTML 輸入文件的一個個字元。該腳本在 HTML 標籤內部逐字原樣輸出所有內容(比如,<html lang="en">
)。在 HTML 標籤外,腳本使用 smartquote()
函數來輸出文本。smartquote()
函數來評估是輸出普通引號還是花引號。
function smartquote (char, prevchar) {
...
}
BEGIN {htmltag = 0}
{
# for each line, scan one letter at a time:
linelen = length($0);
prev = "n";
for (i = 1; i <= linelen; i++) {
char = substr($0, i, 1);
if (char == "<") {
htmltag = 1;
}
if (htmltag == 1) {
printf("%c", char);
}
else {
smartquote(char, prev);
prev = char;
}
if (char == ">") {
htmltag = 0;
}
}
# add trailing newline at end of each line
printf ("n");
}
下面是一個例子:
gawk -f quotes.awk test.html > test2.html
其輸入為:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test page</title>
<link rel="stylesheet" type="text/css" href="/test.css" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" />
</head>
<body>
<h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1>
<p>"Hi there!"</p>
<p>It's and its.</p>
</body>
</html>
其輸出為:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test page</title>
<link rel="stylesheet" type="text/css" href="/test.css" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" />
</head>
<body>
<h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1>
<p>“Hi there!”</p>
<p>It’s and its.</p>
</body>
</html>
via: https://opensource.com/article/18/8/gawk-script-convert-smart-quotes
作者:Jim Hall 選題:lujun9972 譯者:lujun9972 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive