新しい行\ nと次の+記号を空白に置き換える方法

新しい行\ nと次の+記号を空白に置き換える方法

新しい行\ nと今後の+記号を空白に置き換えます。

入力ファイル

ABC

+ DEF



foo

+ bar

出力は次のようになります。

ABC   DEF


foo  bar

答え1

ファイルに+次のように他のすべての行がaで始まるシフトパターンのみが含まれている場合

ABC
+ DEF
foo1
+ bar1
foo2
+ bar2

その後、使用

$ sed 'N;s/\n+  */ /' file
ABC DEF
foo1 bar1
foo2 bar2

これはただ1行を読み、次の行を追加します(使用N)。次に、挿入された改行文字N、プラス記号、およびその後のスペースを単一のスペースに置き換えます。


ファイルが次のようになっているとしましょう。いいえ空行(空行はない行として扱われます+)。最初の行はプラス記号で始めることはできませんが、最後の行はプラス記号で始まります。推定プラス記号で始めます。

ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2

次のsedスクリプトはそれを次に変換します。

ABC DEF
foo1 bar1 baz1
foo2 bar2

スクリプト:

# This is the first line
1 {
    h;      # Save the line in the hold space.
    d;      # Delete and start next cycle.
}

# This line starts with a plus sign and at least one space.
/^+  */ {
    s///;   # Delete the plus sign and the space(s).
    H;      # Append to hold space with embedded newline.
    $ !d;   # Delete and start next cycle (except for on the last line).
}

# This line of input starts a new set of lines.
# Output accumulated line.
x;          # Swap with hold space.
y/\n/ /;    # Replace all embedded newlines with spaces
            # (implicit print)

次のように使用できます。

sed -f script.sed file

「一行」で:

sed -e '1{h;d;}' -e '/^+  */{s///;H;$!d;}' -e 'x;y/\n/ /' file

答え2

Perlを使用すると、ファイル全体を入れて<newline><plus><space>シーケンスを直接置き換えることができます。

$ cat foo.txt
ABC
+ DEF
foo1
+ bar1
+ baz1
foo2
+ bar2
$ perl -0777 -pe 's/\n\+ ?/ /g' < foo.txt
ABC DEF
foo1 bar1 baz1
foo2 bar2

(上記の正規表現は、プラス記号の後のオプションのスペースを削除します)

答え3

に対して文字列または正規表現の使用をサポートするgawkorを使用すると、すべてがはるかに簡単になります。mawkRS

$ awk -vRS='\n[+]' -vORS= 1

または、OPの例のように複数の空行をスキップしたい場合:

$ awk -vRS='\n+[+]' -vORS= 1 OPs_file
ABC DEF



foo bar

これにより、メモリに複数の行がロードされず、最初の行が+

答え4

上記のコマンドを使用せずに、以下のコマンドを実行して実行しました。

方法1

sed '/^$/d' filename|sed "s/[^A-Za-z]//g"|perl -pne "s/\n/ /g"| awk '{print $1,$2"\n"$3,$4}'

output
ABC DEF
foo bar

2番目の方法

step1:

    p=`cat y.txt| sed '/^$/d'| sed "s/[^A-Za-z]//g"| awk '{print NR}'| sort -rn| sed -n '1p'`


step2:

    for ((i=1;i<=$p;i++)); do cat y.txt| sed '/^$/d'|sed -n ''$i'{p;n;p}'| sed "N;s/\n/ /g";i=$(($i+1)); done| sed "s/[^a-zA-Z]/ /g"


output
ABC   DEF
foo   bar

関連情報