Como pode sed adicionar texto após o recuo existente?

1

Eu tenho um script sed que possui:

sed -i '/ *it.*do/! {
          /\.should/ {
            s/\.should/)\.to/
            s/\(\S\)/expect(/ 
            # ...others

O último s adiciona expect( ao início da linha. Eu não entendo como isso funciona.

Funciona para:

Original:

  it "uses the given count if set" do
    call('5').should == 5
  end

  it "uses the processor count from Parallel" do
    call(nil).should == 20
  end

Depois:

  it "uses the given count if set" do
    expect(call('5')).to eq 5
  end

  it "uses the processor count from Parallel" do
    expect(call(nil)).to eq 20
  end

Mas não adiciona o expect( para:

Original:

  it "does not wait if not run in parallel" do
    ParallelTests.should_not_receive(:sleep)
    ParallelTests.wait_for_other_processes_to_finish
  end

  it "stops if only itself is running" do
    ENV["TEST_ENV_NUMBER"] = "2"
    ParallelTests.should_not_receive(:sleep)
    with_running_processes(1) do
        ParallelTests.wait_for_other_processes_to_finish
      end
  end

Depois - sem expect( ...

  it "does not wait if not run in parallel" do
    ParallelTests).to_not receive(:sleep)
    ParallelTests.wait_for_other_processes_to_finish
  end

  it "stops if only itself is running" do
    ENV["TEST_ENV_NUMBER"] = "2"
    ParallelTests).to_not receive(:sleep)
    with_running_processes(1) do
        ParallelTests.wait_for_other_processes_to_finish
      end
  end

No entanto, DO funciona para:
Depois:

  it "should be true when there is a Gemfile" do
    use_temporary_directory_for do
      FileUtils.touch("Gemfile")
      expect(ParallelTests.send(:bundler_enabled?)).to eq true
    end
  end
    
por Michael Durrant 16.11.2013 / 16:41

1 resposta

2

É apenas uma classe de caracteres , pois você não tem o sinal -r definido como \( e \) fazem um grupo para referência posterior e \S é apenas o grupo complementar para \s , pois \s é o grupo que corresponde a qualquer espaço em branco \S é o grupo que corresponde a qualquer coisa que não seja branco espaço.

Isso significa que o regex s/\(\S\)/expect(/ adiciona expect( na frente do primeiro espaço não branco:

# echo ' ' | sed "s/\(\S\)/expect(/"

# echo '   a' | sed "s/\(\S\)/expect(/"
   expect(a

Então, acho que estou tentando dizer que seu script muda a linha:

ParallelTests.should_not_receive(:sleep)

Deve ser alterado:

# echo "ParallelTests.should_not_receive(:sleep)" | sed '/ *it.*do/! {
    /\.should/ {
        s/\.should/)\.to/
        s/\(\S\)/expect(/ 
    }
}'
expect(ParallelTests).to_not_receive(:sleep)
    
por 16.11.2013 / 22:23

Tags