みなさん、こんにちは!
sed cmdを使用してテキストファイルのディレクトリパスを変更しようとしています。
コマンドをテストしているサーバーは、Rocky Linux 8.5(Green Obsidian)を実行しています。
これは私が使用するsedコマンドです。
sed -i 's|1344P1052_ssl02 /gs:/prod1|sd://prod1-backup|g' example.txt
sed -i 's|1344P1052_ssl09 /gs:/prod1|sd://prod1-backup|g' example.txt
出力にエラーはありませんが、ファイルのディレクトリパスは同じままです。
変更する必要があります。 【下記例】
今後:
1344P1052_ssl02 /gs:/prod1/some_notes_here_1
1344P1052_ssl09 /gs:/prod1/some_notes_here_2
後ろに:
sd://prod1-backup/some_notes_here_1
sd://prod1-backup/some_notes_here_2
スペース、セミコロンなどのために機能しないと思いましたが、グループの回答をGoogleで検索して使用しました。|
特殊文字、バックスラッシュ、スペースを使用する必要があります。今はわからないので、vimを使って1行ずつ手動で行いました。
どんな助けでも本当にありがとう...
ベストアンサー1
入力ファイルの2つの列がスペースで区切られず、タブで区切られているため、置換が失敗したとします。
正規表現では、スペースの代わりにリテラルタブ文字(コマンドラインで入力を使用)を使用するか、(単一のタブまたはスペース文字の一致)または(一致)などのタブCtrl+V Tab文字を表す式を使用できます。単一の水平タブと垂直タブ、キャリッジリターンなどを含む、より大きなスペースに似た文字グループ内の単一文字です。[[:blank:]]
[[:space:]]
sed -e 's|^1344P1052_ssl02[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-e 's|^1344P1052_ssl09[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
またはより短く、
sed -e 's|^1344P1052_ssl0[29][[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
- パターンの空白をに変更しました
[[:blank:]]
。これにより、テキスト内の対応する場所に単一のスペースまたはタブが許可されます。 sed
また、ファイル全体を2回読み取ることを避けるために、これら2つの置換を1つの呼び出しにまとめました。g
1行に2回以上の交換を実行したくないため、両方の交換コマンドからフラグを削除しました。^
各行の先頭にパターンが一致することを確認するためにアンカーを追加しました。- より高い番号のコンテンツ
/
に関連する行が誤って変更されるのを防ぐために、パターンの末尾に代替文字列を追加しました。prod10
prod