次の行があります
// Testing this
sedコマンドを使用して、各行の//を/ *(中間の文または単語)* /に置き換えようとします。
だから、次のようにする必要があります
/* Testing this */
最初の部分は呼びやすいです。
sed 's#//#/*#'
しかし、2番目の部分ではこのソリューションを試しました。
この機能を使用しようとすると、-e
「終了していないコマンド」エラーが発生しました。その後、セミコロンを使用して1つにしようとしました。
's#//#/*#;#//#s#/$#*/#'
//
ただし、これは最初の部分(aで置き換え/*
)のみが行われ、2番目の部分(aを*/
同じ行の末尾に配置)ではないようです。
私は何が間違っていましたか?どんなアドバイスも本当にありがとうございます。
答え1
どうですか?
$ cat testfile
// Testing this
foobar
$ sed 'sx//\(.*\)x/*\1 */x' testfile
/* Testing this */
foobar
$
sx//
: 以下を含む行の検索//
\(.*\)x
: 行の残りの部分をキャプチャグループ 1 に入れます。/*\1 */x
:行の残りの部分を/*
(コメントの始まり、Cスタイル)に置き換え、キャプチャグループ1の内容(で参照\1
)、それから*/
(コメントの終わり、Cスタイル)に置き換えます。
答え2
別のアプローチ:コメントと正確に一致する条件で検索と置換を実行します。
sed '\!//! {s!!/*!; s!$! */!}' file
内容は次のとおりです。
- 行にパターンが含まれている
//
場合- 一致するテキストを次に置き換えます。
/*
- 次に、行末の空の文字列を次に置き換えます。
*/
- 一致するテキストを次に置き換えます。