3

質問はHTML コード (Automator/AppleScript)へのプレーン テキスト URL の続編です。

プレーンな txt ファイル /Users/myname/Desktop/URLlist.txt があるとします。

title 1
http://a.b/c

title 2
http://d.e/f

...

(1) すべての URL ( http://.. .) を HTML コードに変換し、(2) を追加したい

&nbsp;<br />

前述の内容は次のようになります。

title 1
<a href="http://a.b/c">http://a.b/c</a>
&nbsp;<br />
title 2
<a href="http://d.e/f">http://d.e/f</a>
&nbsp;<br />
...

次のApplescriptに行き着きました:

set inFile to "/Users/myname/Desktop/URLlist.txt"
set middleFile to "/Users/myname/Desktop/URLlist2.txt"
set outFile to "/Users/myname/Desktop/URLlist3.txt"

do shell script "sed 's/\\(http[^ ]*\\)/<a href=\"\\1\">\\1<\\/a>/g' " & quoted form of inFile & " >" & quoted form of middleFile
do shell script "sed 's/^$/\\&nbsp;<br \\/>/g' " & quoted form of middleFile & " >" & quoted form of outFile

動作しますが、冗長です (そしてばかげていますか?)。誰かがそれをもっと簡潔にすることができますか? テキスト ファイルを 3 つではなく 1 つだけ使用することはできますか (つまり、/Users/myname/Desktop/URLlist.txt の元のコンテンツが最終結果で上書きされます)。

事前にどうもありがとうございました。

4

3 に答える 3

2

試す:

set inFile to "/Users/myname/Desktop/URLlist.txt"

set myData to (do shell script "sed '
/\\(http[^ ]*\\)/ a\\
&nbsp;<br />
' " & quoted form of inFile & " | sed 's/\\(http[^ ]*\\)/<a href=\"\\1\">\\1<\\/a>/g' ")

do shell script "echo " & quoted form of myData & " > " & quoted form of inFile

これにより、後でスクリプトで myData 変数を使用できるようになります。これがより大きなスクリプトの一部ではなく、単にファイルを変更する場合は、jackjr300 が提案するように -i オプションを使用してください。また、このスクリプトは、単に空の行を探すのではなく、元のパターンを探して新しい行を追加します。

編集:

set inFile to "/Users/myname/Desktop/URLlist.txt"
set myData to (do shell script "sed 's/\\(http[^ ]*\\)/<a href=\"\\1\">\\1<\\/a>/g; s/^$/\\&nbsp;<br \\/>/g' " & quoted form of inFile)
do shell script "echo " & quoted form of myData & " > " & quoted form of inFile
于 2012-12-08T16:17:07.167 に答える
2

オプションを使用して、ファイルをその-i ''場で編集します。

set inFile to "/Users/myname/Desktop/URLlist.txt"

do shell script "sed -i '' 's:^$:\\&nbsp;<br />:; s:\\(http[^ ]*\\):<a href=\"\\1\">\\1</a>:g' " & quoted form of inFile

元のファイルのコピーが必要な場合は、次のような特定の拡張子を使用しますsed -i ' copy'

- 更新しました:

`DOCTYPE は必須のプリアンブルです。従来の理由から DOCTYPE が必要です。省略した場合、ブラウザーは一部の仕様と互換性のない別のレンダリング モードを使用する傾向があります。ドキュメントに DOCTYPE を含めることで、ブラウザは関連する仕様に従うために最善を尽くそうとします。

HTML lang 属性を使用して、Web ページまたは Web ページの一部の言語を宣言できます。これは、検索エンジンとブラウザを支援するためのものです。W3C の勧告によると、<html>タグ内の lang 属性を使用して、各 Web ページの主要言語を宣言する必要があります。

タグは、<meta>HTML ドキュメントに関するメタデータを提供します。<meta>タグは常に<head>要素内に配置されます。このhttp-equiv属性は、コンテンツ属性の情報/値の HTTP ヘッダーを提供します。 :または name 属性 contentに関連付けられた値。注: HTMLページを正しく表示するには、ブラウザは使用する文字セットを認識している必要があります。http-equivcharset

このスクリプトでは、エンコーディングとして「utf-8」を入力しました。元のファイルのエンコーディングで変更します。

set inFile to "/Users/myname/Desktop/URLlist.html" -- text file with a ".html" extension
set nL to linefeed
set prepandHTML to "<!DOCTYPE html>\\" & nL & "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\\" & nL & tab & "<head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\\" & nL & "</head>\\" & nL

do shell script "sed -i '' 's:^$:\\&nbsp;<br />:; s:\\(http[^ ]*\\):<a href=\"\\1\">\\1</a>:g; 1s~^~" & prepandHTML & "~' " & quoted form of inFile
do shell script "echo '</html>' " & quoted form of inFile -- write last HTML tag
于 2012-12-08T16:25:39.460 に答える
1

私はsedコマンドをよく理解できません(頭が痛くなります)ので、このタスクを実行するapplescriptの方法を次に示します。それが役に立てば幸い。

set f to (path to desktop as text) & "URLlist.txt"

set emptyLine to "&nbsp;<br />"
set htmlLine1 to "<a href=\""
set htmlLine2 to "\">"
set htmlLine3 to "</a>"

-- read the file into a list
set fileList to paragraphs of (read file f)

-- modify the file as required into a new list
set newList to {}
repeat with i from 1 to count of fileList
    set thisItem to item i of fileList
    if thisItem is "" then
        set end of newList to emptyLine
    else if thisItem starts with "http" then
        set end of newList to htmlLine1 & thisItem & htmlLine2 & thisItem & htmlLine3
    else
        set end of newList to thisItem
    end if
end repeat

-- make the new list into a string
set text item delimiters to return
set newFile to newList as text
set text item delimiters to ""

-- write the new string back to the file overwriting its contents
set openFile to open for access file f with write permission
write newFile to openFile starting at 0 as text
close access openFile

EDIT : エンコーディングに問題がある場合、これら 2 つのハンドラーは読み取り/書き込みを適切に処理します。したがって、それらをコードに挿入し、それらの行を調整してハンドラーを使用するだけです。幸運を。

: TextEdit を使用してファイルを開く場合は、[ファイル] メニューを使用して、特に UTF-8 として開いてください。

on writeTo_UTF8(targetFile, theText, appendText)
    try
        set targetFile to targetFile as text
        set openFile to open for access file targetFile with write permission
        if appendText is false then
            set eof of openFile to 0
            write «data rdatEFBBBF» to openFile starting at eof -- UTF-8 BOM
        else
            tell application "Finder" to set fileExists to exists file targetFile
            if fileExists is false then
                set eof of openFile to 0
                write «data rdatEFBBBF» to openFile starting at eof -- UTF-8 BOM
            end if
        end if
        write theText as «class utf8» to openFile starting at eof
        close access openFile
        return true
    on error theError
        try
            close access file targetFile
        end try
        return theError
    end try
end writeTo_UTF8

on readFrom_UTF8(targetFile)
    try
        set targetFile to targetFile as text
        targetFile as alias -- if file doesn't exist then you get an error
        set openFile to open for access file targetFile
        set theText to read openFile as «class utf8»
        close access openFile
        return theText
    on error
        try
            close access file targetFile
        end try
        return false
    end try
end readFrom_UTF8
于 2012-12-08T18:01:33.817 に答える