SED:最後の2行目の後に何かを挿入しますか?

SED:最後の2行目の後に何かを挿入しますか?

XML構成ファイルで最後のクローズタグが壊れないように1行を追加する必要があります。 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

2番目から最後の行の後に行を挿入するには、次の2つの方法を考えます。

  1. まず、行数を計算して編集します。

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

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

関連情報