Saya memiliki isi file seperti:

data {
    x = "name",
    y = "job"
    z = "role"
  }

Saya ingin menambahkan = di depan braket keriting ketika hilang, jika tidak, abaikan saja

Output harus:

data = {
    x = "name",
    y = "job"
    z = "role"
  }

Saya mencoba ini tetapi tidak berhasil. sed -r -ie 's|data \{ | data \= \{|g' abc.txt

Adakah yang bisa mengatakan apa yang saya lakukan salah?

Terima kasih

sed
1
MKS 29 Mei 2021, 00:59

2 jawaban

Jawaban Terbaik

Kamu bisa memakai

sed -r -i 's|(data)[[:space:]]*(\{)|\1 = \2|g' abc.txt
sed -i 's|data[[:space:]]*\{|data = {|g' abc.txt

detail :

  • -r (atau -E) Opsi memungkinkan sintaksis regex POSIX
  • (data)[[:space:]]*(\{) - cocok dan menangkap data ke grup 1, [[:space:]]* cocok dengan nol atau lebih spasi putih, (\{) menangkap ke dalam grup 2 a { char
  • \1 = \2 - menggantikan dengan nilai grup 1, ruang, =, ruang dan grup 2 nilai.

Lihat Demo Online .

Catatan : Jika Anda perlu memastikan pola cocok dengan seluruh baris menambahkan jangkar, ^ dan $:

's|^(data)[[:space:]]*(\{)$|\1 = \2|g'

Dalam SED GNU, Anda dapat menggunakan formulir yang lebih pendek untuk [[:spaces:]]*, \s*:

's|^(data)\s*(\{)$|\1 = \2|'

Jika ada spasi putih / trailing space dan Anda harus tetap menggunakannya:

's|^(\s*data)\s*(\{\s*)$|\1 = \2|'
0
Wiktor Stribiżew 28 Mei 2021, 22:08

sed '/=/!s/data /&= /' abc.txt

Pada baris tidak memiliki tanda yang sama, ganti data + ruang dengan data + ruang + sama + ruang.

0
stevesliva 29 Mei 2021, 01:38