テキスト\ nを改行文字に置き換える方法は? (OS X で) [重複]

テキスト\ nを改行文字に置き換える方法は? (OS X で) [重複]

シェル履歴から何かを抽出してファイルに保存するスクリプトがありますが、履歴アイテムに改行がある場合は、改行ではなく\nテキストとして返されます。\nファイルに保存する前に改行文字に置き換えたいと思います。

sed私はOS Xを使用していますが、問題がOSに付属のBSDベースの問題である可能性があると思いました。sedgsedsedgsed

history -1 | awk '{$1=""; print}' | gsed -e 's/^[[:space:]]*//' -e s/'\\n'/"\n"/

しかし、可能であれば、LinuxまたはOSの基本ユーティリティで使用できることを望みます。sed明らかにgsed必要。sedsedgsed

ベストアンサー1

sed 's/\\\\/& /g;s/\\n/\
/g;  s/\\\\ /\\\\/g' <in >out

...バックスラッシュエスケープを誤って解釈せずにewline置換を処理する必要があります。これにより、\n入力にリテラルを含めることができます。しかし、私は履歴コマンドから\\n取得する方法について少しあいまいです。\n

次のようにエスケープせずに履歴ファイルからewlineを読み取るzsh方法を見つけようとします。\n

echo '
\n'
history -1

11355 echo '\n\n'

それは動作しません。だから私はこれを試しました:

hist(){ ! cat "$1"; }
echo '
\n'
FCEDIT=hist fc -1

echo '
\n'

...これはおそらくあなたがしなければならないことです。

何らかの理由で、ewlinesまたは出力はあいまいな方法でzshエスケープされますが、一部の編集者に履歴コマンドを提供すると、実際のコンテンツが提供されます。\nhistoryfc -l

zsh主なhistory動作モードはfcであり、historyコマンドはのエイリアスにすぎませんfc -lfcこのオプションを使用して呼び出すと、一致する-l履歴行が標準出力として一覧表示されます。(印刷できない文字を曖昧にエスケープした後)ただし、fcデフォルトの動作は、その引数のすべての履歴の発生を記録した1つ以上の一時ファイル引数を使用して別のユーティリティを呼び出すことです。

fc環境変数から呼び出されるユーティリティの名前を派生します$FCEDIT。設定されていないかnullの場合、$EDITORまたは同様に失敗した場合はデフォルト値から派生しますvi。呼び出されたユーティリティがtrueを返すと、そのユーティリティをfc実行しようとします。(おそらく)一時ファイルが削除される前に編集されました。

したがって、上記のコマンドシーケンスは、catすべてのエディタコマンドを置き換えて戻り値を反転し、一時ファイルを正常に読み取るとfalseを返すことで、コマンドを実行しようとする追加の試みをfc防ぎます。fc

外部ユーティリティ呼び出しを必要としない、より完全な組み込みソリューションは次のとおりです。

history()
        case    $1      in
        (*/*) ! while   [ -r "$1" ]
                do      while   read -rE RTN
                        do :;   done    <$1
                shift;  done;;
        (*)     local   RTN=1  IFS=
                FCEDIT=history fc "$@"
                return  $((RTN*$?))
        esac

zsh...コマンドが実行されると予想されるすべての引数のリストをほぼ透過的に処理する必要がありますhistory。ただし、出力は常にリテラルであり、出力には記録タイムスタンプやイベント番号は含まれません。(このように呼び出さない限りhistory -l [args]、この場合内蔵機能で動作しますhistory

おすすめ記事