sed 기존 들여쓰기 뒤에 텍스트를 추가하는 방법은 무엇입니까?

sed 기존 들여쓰기 뒤에 텍스트를 추가하는 방법은 무엇입니까?

다음을 포함하는 sed 스크립트가 있습니다.

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

마지막 항목이 줄의 시작 부분에 s추가됩니다 . expect(나는 그것이 어떻게 작동하는지 이해하지 못합니다.

이는 다음에 적용됩니다:

원래:

  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

뒤쪽에:

  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

expect(그러나 for:는 추가되지 않습니다 .

원래:

  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

그 후 - 아니 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

그러나 그것은하다근무 시간:
이후:

  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

답변1

그것은 단지캐릭터 클래스-r, 나중에 참조하기 위해 플래그를 설정 \(하고 \)그룹을 생성 하지 않고 \S단지 보완적인 그룹 이기 때문입니다. 공백과 일치하는 그룹은 공백 이외의 모든 것과 일치하는 그룹이기 \s때문입니다 .\s\S

이는 공백이 아닌 첫 번째 앞에 정규식이 s/\(\S\)/expect(\1/추가된다는 의미입니다.expect(

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

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

그래서 제가 말하는 것은 귀하의 스크립트가 다음 줄을 변경한다는 것입니다.

ParallelTests.should_not_receive(:sleep)

그것을 바꿔야 합니다:

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

관련 정보