長いsed式を複数の行に分割する方法は?


14
sed 's/[long1][long2]/[long3][long4]/' file.txt

このコマンドを複数の行に分割したい-fxのようなもの:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

\文字列の使用または分離は機能しませんでした。



そのため、Perlには/x置換の修飾子があります。
チョロバ14

1
@Networker:はい、ありがとう、そこにも私の答えを追加しました
ラファエル14

回答:


8

長い文字列をbash変数に保存して、sedコマンドで使用できます。

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

を使用できる場合はperlx修飾子を使用して長いパターンを分割できます。

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
なぜそんなに多くの引用符を使用するのですか?sed "s/$string/$replace/" file.txt結構です。
スコット14

1
また、もちろん、の後にスペースを削除する必要がありますreplace=
スコット14

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

新しい行がインデントされていない場合、バックスラッシュで複数の行に分割することはできます。

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

GNU sed 4.2.2でCygwinでテスト済み


sedバージョンは何ですか?私はでテストしGNU sed version 4.2.1、それは動作しません。
cuonglm

2
最初の行の最後にバックスラッシュが欠落しているように見えます。
フォルカーシーゲル14

6

別の側面:

[long]上記のアイテムはどの程度保守可能ですか?

短くて明確に句を保持できるほど、時間の経過や(sed-external)ファクトが提供する機能の周りで変化するにつれて、それらの句を簡単に変更および強化できます。

例えば

sed \
-e 's / [minimal-s1] / [minimal-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

...努力して好むものかもしれません。


4

これを次のように分割することもできます。

sed '/[long1][long2]/
    s//[long3][long4]/'

または多分次のように:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

または、ヒアドキュメントで:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.