必须编写以这种方式更新文件的脚本。
原始文件:
<?blah blah blah?>
<pen>
<?pineapple?>
<apple>
<pen>
最终档案:
<?blah blah blah?><pen>
<?pineapple?><apple><pen>
文件中的任何地方,如果新的行章程没有后跟
<?
我们必须删除换行符才能将其附加到上一行的末尾。
如果你解释你的sed是如何工作的,那将会非常有用。
答案 0 :(得分:0)
Perl解决方案:
perl -pe 'chomp; substr $_, 0, 0, "\n" if $. > 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)
如果您对将每个<?
放在一行开头的解决方案感到满意,可以将tr
与sed
合并。
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}'
接下来打印您读取的行而不使用换行符。 你最后想要换行。