SED: 끝에서 두 번째 줄 뒤에 뭔가를 삽입하시겠습니까?

SED: 끝에서 두 번째 줄 뒤에 뭔가를 삽입하시겠습니까?

XML 구성 파일에서 마지막 닫는 태그가 깨지지 않도록 한 줄을 추가해야 합니다. SED를 사용하여 이를 달성할 수 있습니까?

전체 파일의 줄 수는 서버마다 다를 수 있습니다.

편집: 편집해야 할 파일의 몇 가지 예:

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

다른 예시:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration>

    <property name="DEV_HOME" value="c:/logs" />

    <appender name="FILE-AUDIT"
      class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>${DEV_HOME}/debug.log</file>
      <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
          %d{yyyy-MM-dd HH:mm:ss} - %msg%n
        </Pattern>
      </encoder>

      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
                          </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
          <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
      </rollingPolicy>

    </appender>

    <logger name="com.mkyong.web" level="debug"
      additivity="false">
      <appender-ref ref="FILE-AUDIT" />
    </logger>

    <root level="error">
      <appender-ref ref="FILE-AUDIT" />
    </root>

    <logger name="com.mkyong.ext" level="debug"
      additivity="false">
      <appender-ref ref="FILE-AUDIT" />
    </logger>

      <logger name="com.mkyong.other" level="info"
      additivity="false">
      <appender-ref ref="FILE-AUDIT" />
    </logger>

      <logger name="com.mkyong.commons" level="debug"
      additivity="false">
      <appender-ref ref="FILE-AUDIT" />
    </logger>
  </configuration>

답변1

i마지막( $) 행 앞에 행을 삽입 하려면 다음을 수행합니다.

$ cat test
one
two
three
four
five

$ sed '$i<hello>!' test
one
two
three
four
<hello>!
five

이는 GNU용입니다 sed(선행 공백이나 탭이 제거됨에 유의하세요). 이식성을 가지려면(또는 sed삽입된 줄의 선행 공백이나 탭을 유지하려는 경우 GNU를 사용하려면) 다음이 필요합니다.

sed '$i\
<hello>!' test

답변2

예, sed수행할 작업을 지시하기 전에 행 번호를 작성하여 특정 행에서만 작업하는 것이 가능합니다. 예를 들어 foo파일의 4번째 줄 뒤에 문자열이 포함된 줄을 삽입하려면 다음을 수행합니다.

sed '4s/$/\nfoo/' file  # GNU sed and a few others
sed '4s/$/\
foo/' file # standardly/portably

두 번째에서 마지막 행 다음에 행을 삽입하려면 다음 두 가지 방법을 생각해 볼 수 있습니다.

  1. 먼저 행 수를 계산한 다음 편집하세요.

    sed "$(( $( wc -l < file) -2 ))s/$/\nfoo/" file
    
  2. 사용 tac:

    tac file | sed '2s/$/\nfoo/' | tac
    

관련 정보