![テキスト\ nを改行文字に置き換える方法は? (OS X で) [重複]](https://linux33.com/image/77841/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%5C%20n%E3%82%92%E6%94%B9%E8%A1%8C%E6%96%87%E5%AD%97%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20(OS%20X%20%E3%81%A7)%20%5B%E9%87%8D%E8%A4%87%5D.png)
シェル履歴から何かを抽出してファイルに保存するスクリプトがありますが、履歴アイテムに改行がある場合は、改行ではなく\n
テキストとして返されます。\n
ファイルに保存する前に改行文字に置き換えたいと思います。
sed
私はOS Xを使用していますが、問題がOSに付属のBSDベースの問題である可能性があると思いました。sed
gsed
sed
gsed
history -1 | awk '{$1=""; print}' | gsed -e 's/^[[:space:]]*//' -e s/'\\n'/"\n"/
しかし、可能であれば、LinuxまたはOSの基本ユーティリティで使用できることを望みます。sed
明らかにgsed
必要。sed
sed
gsed
答え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
エスケープされますが、一部の編集者に履歴コマンドを提供すると、実際のコンテンツが提供されます。\n
history
fc -l
zsh
主なhistory
動作モードはfc
であり、history
コマンドはのエイリアスにすぎませんfc -l
。fc
このオプションを使用して呼び出すと、一致する-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
)。