使用sed通过检查表达式删除换行符

时间:2017-01-03 13:45:57

标签: linux shell unix sed aix

必须编写以这种方式更新文件的脚本。

原始文件:

<?blah blah blah?>
<pen>
<?pineapple?>
<apple>
<pen>

最终档案:

<?blah blah blah?><pen>
<?pineapple?><apple><pen>

文件中的任何地方,如果新的行章程没有后跟

<?

我们必须删除换行符才能将其附加到上一行的末尾。

如果你解释你的sed是如何工作的,那将会非常有用。

3 个答案:

答案 0 :(得分:0)

Perl解决方案:

perl -pe 'chomp; substr $_, 0, 0, "\n" if $. > 1 && /^<\?/'
  • -p逐行读取输入,在更改后打印每一行
  • chomp删除了最终换行符
  • 带有4个参数的
  • substr修改输入字符串,如果它不是第一行($.是输入行号),它会在新行前面添加新行,并且行以{{1开头}}。

答案 1 :(得分:0)

Sed解决方案:

FROM klousiaj/oracle-java:7.79
MAINTAINER J.P. Klousia <klousiaj>

ENV DOWNLOAD http://www.h2database.com/h2-2016-10-31.zip
ENV DATA_DIR /opt/h2-data

RUN curl ${DOWNLOAD} -o h2.zip \
    && unzip h2.zip -d /opt/ \
    && rm h2.zip \
    && mkdir -p ${DATA_DIR}

EXPOSE 8082 9092

CMD java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \
    -web -webAllowOthers -webPort 8082 \
    -tcp -tcpAllowOthers -tcpPort 9092 \
    -baseDir ${DATA_DIR}

VOLUME ${DATA_DIR}

基本思路是更换每一个

sed ':a;N;$!ba;s/\n\(<[^?]\)/\1/g' file > newfile 后跟\n ,然后是<

除了?以外你匹配的内容。

答案 2 :(得分:0)

如果您对将每个<?放在一行开头的解决方案感到满意,可以将trsed合并。

tr -d '\n' < inputfile| sed 's/<?/\n&/g;$s/$/\n/'

说明:
我使用tr ... < inputfile而非cat inputfile | tr ...来避免额外的cat来电 sed命令有2个部分 在s/<?/\n&/g中,它会插入一个换行符,而&会插入匹配的字符串(在这种情况下始终为<?,因此它只会保存一个字符)。
使用$s/$/\n/,在最后一行的末尾附加换行符。

编辑:如果您在<?之前只需要换行符,那么 你可以使用awk

awk '$1 ~ /^<\?/ {print} {printf("%s",$0)} END {print}'

说明:
将换行视为行的开头,而不是结束。然后,您的问题将转换为“当行以<?开头时写一个换行符。您必须转义?并使用^作为行的开头。

awk '$1 ~ /^<\?/ {print}'

接下来打印您读取的行而不使用换行符。 你最后想要换行。