web-dev-qa-db-ja.com

sed改行から文字を削除します

いくつかの処理の後、私は以下のような入力ファイルを持っています。

file1.txt

12345|john|student
43321|jack|professor

78965|alex|lecturer

上記のファイルをさらに処理する必要があるため、行の最後にも改行が必要です。現在、以下のように達成できます。

sed 's/$/|/' file1.txt

上記のコマンドは、次のように出力されます。

12345|john|student|
43321|jack|professor|
|
78965|alex|lecturer|

ご覧のとおり、空白行にも|が追加されています。以下のコマンドを使用して、空白行から|文字を再度削除しようとすると、

sed 's/|//g' file1.txt

|文字はどこでも削除されています。空白行の|のみを削除するにはどうすればよいですか?空白行も保持する必要があります。

4
Ramesh

オリジナルから、空白でない行に|を追加できます。

sedの使用:

sed -e '/^$/!s/$/|/' file

Perlの使用:

Perl -lpe 's/$/|/ if length' file

空白の行から|を削除する場合(2番目のバージョン):

Perl -lpe 's/\|// if length == 1'
2
cuonglm

以下のコマンドで実行できました。

sed 's/^|//' file1.txt

基本的には、^を使用して最初の文字のみをチェックし、それが|の場合は、削除します。

3
Ramesh
sed '/../!d;a\ ' file

これは、以下の目的とほぼ同じ目的に役立ちます。 2文字以上を含まない行を削除し、残りのすべてに空白を追加します。

これは私にあなたの問題のようなファイルを与えます:

printf '12345|john|student\n|\n|\n|\n%.0b' `seq 1 10` >|./file1.txt

次のようになります。

12345|john|student
|
|
|

しかし、10回繰り返されました。

次にこれ:

sed -n '/[^|].*/s//&|\n/p' ./file1.txt

私に与える:

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

申し訳ありませんが、正しく実行するのに少し時間がかかりました。私は自分の電話でこれらの答えを書くのをやめる必要があります...

3
mikeserv

|を追加するだけです少なくとも1文字の行に:

sed 's/\(.\)$/\1|/' file1.txt
2
Walter A

sedの場合:

sed -i~ -re 's/^\|$//' file

^行末パイプ\|および行末$を検索します。 //は文字を削除します。 -i~を使用してファイルを編集し、バックアップfile~を作成します。

1
user55518

問題のコマンドから始めて、オプションg(再帰的)を削除し、パイプの前にハット文字^を追加して、最初の文字のみをチェックできます。

sed 's/^|//' file1.txt
0
Barry