質問
私はTermuxを使用していますが、Termuxでは/usr
ありませんが/data/data/com.termux/files/usr
。
これにより、Termuxを念頭に置いて設計されていないスクリプト(主にbashとmake)を実行すると問題が発生することがあります。
私の意図
スクリプトがから始まるパスのファイルを開こうとするたびに、有効なパスで/usr
「再作成」されることを望みます。
この問題に対する解決策も歓迎します。
ベストアンサー1
簡単な答えは、「スクリプト内の tosed
のすべての項目を変更すること」です。例えば/usr
/data/data/com.termux/files/usr
sed -i -e 's=/usr=/data/data/com.termux/files/usr=g' *.sh
問題は、ルートの一部または全部が/usr
すでにに変更されている場合は/data/data/.../usr
再び変更され、最終的にはに変更されることです/data/data/com.termux/files/data/data/com.termux/files/usr
。例えば
$ echo /usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /data/data/com.termux/files/usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/data/data/com.termux/files/usr
この問題を解決するには、/usrの前にスペースがある場合、または行の先頭にある場合にのみ変更を許可してください。
$ echo /data/data/com.termux/files/usr | sed -e 's=\(^\|[[:space:]]\)/usr=\1/data/data/com.termux/files/usr=g'
または、より読みやすく拡張正規表現を使用してください。
$ echo /data/data/com.termux/files/usr | sed -E -e 's=(^|[[:space:]])/usr=\1/data/data/com.termux/files/usr='
/data/data/com.termux/files/usr
以下は私が振り返ることが不要であることを覚えておく前に書かれています(IMO、それは「より良い」一般的に有用な解決策ですが必ずしも必要ではありません)....有用な情報なので、ここに残して、ではありません。これ:
あるいは、「negative lookbehind」という正規表現機能を使用することもできます。残念ながら、sedはLook-BehindやLook-aheads(*)をサポートしていません。
Perlはツアーをサポートしているので、Termuxと一緒にPerlをインストールした場合はそれを使用できます(termuxを最後に使用してから古いので、デフォルトのPerlが含まれているかどうかは覚えていません。もちろんインストール可能なバッグです)。例えば
perl -i -p -e 's=(?<!/data/data/com.termux/files/)/usr=/data/data/com.termux/files/usr=g' *.sh
(しかし、-p
オプションがあればPerlは標準入力やファイルを修正するツールとしてsedのように動作します。-n
オプションがあればPerlはsedのように動作しますsed -n
。これは意図的なものです。と同様のツール)。
または、次のような場合に否定的な振り返りを使用すると、/ usrの変更を回避できます。どの英数字または/
文字が直前に続きます/usr
。
perl -i -p -e 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g' *.sh
以下では、/ usrはそれ自体の場合にのみ変更されることがわかります。
$ echo /usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /data/data/com.termux/files/usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /foo/bar/usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/foo/bar/usr
(*) 私が知る限り、ツアーをサポートする唯一の sed バージョンは Super Sed またはSSD(現在のホームページは利用できません。)ssed
捨てられたソフトウェアと思われ、長年更新されていません。これは1998年のGNU sed 3.02に基づいており、現在GNU sedは2020年のバージョン4.8です。 ssed
Debian用にパッケージ化されているので、Termuxでも利用できます。しかし、インストールしたい場合はPerlを使用することができます。
とにかくPerl準拠の正規表現を使用するオプションがssed
あります。-R
ポリメラーゼ連鎖反応。
$ echo /data/data/com.termux/files/usr | ssed -R 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr='
/data/data/com.termux/files/usr
$ echo /foo/bar/usr | ssed -R 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr='
/foo/bar/usr