Tôi đang cố gắng xóa các dòng trống bằng sed:
sed '/^$/d'
nhưng tôi không có may mắn với nó
Ví dụ: tôi có những dòng này:
xxxxxx
yyyyyy
zzzzzz
và tôi muốn nó giống như:
xxxxxx
yyyyyy
zzzzzz
Những gì nên được mã cho điều này?
Tôi đang cố gắng xóa các dòng trống bằng sed:
sed '/^$/d'
nhưng tôi không có may mắn với nó
Ví dụ: tôi có những dòng này:
xxxxxx
yyyyyy
zzzzzz
và tôi muốn nó giống như:
xxxxxx
yyyyyy
zzzzzz
Những gì nên được mã cho điều này?
Câu trả lời:
Bạn có thể có khoảng trắng hoặc tab trong dòng "trống" của mình. Sử dụng POSIX lớp với sed
để loại bỏ tất cả các dòng chỉ chứa khoảng trắng:
sed '/^[[:space:]]*$/d'
Một phiên bản ngắn hơn sử dụng ERE, ví dụ với gnu sed:
sed -r '/^\s*$/d'
(Lưu ý rằng sed KHÔNG hỗ trợ PCRE.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
sẽ khớp với tất cả các dòng "trống", có nghĩa là trống ở đây, dòng không chứa ký tự hoặc dòng chỉ chứa các chuỗi trống (Ví dụ: khoảng trắng). Tất cả các dòng phù hợp sẽ được loại bỏ bởi sed, với d
lệnh.
Tôi đang thiếu awk
giải pháp:
awk 'NF' file
Mà sẽ trở lại:
xxxxxx
yyyyyy
zzzzzz
Cái này hoạt động ra sao? Vì NF
là viết tắt của "số trường", các dòng đó trống có 0 fiedls, do đó awk đánh giá 0 thành Sai và không có dòng nào được in; tuy nhiên, nếu có ít nhất một trường, đánh giá là True và awk
thực hiện hành động mặc định của nó: in dòng hiện tại.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Bạn có biết một cách tiện lợi để đưa điều này vào một kịch bản awk như, ví dụ, một mô hình không? awk '/ mypotype / {do Stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
Sẽ ổn thôi, bạn có định sửa đổi tập tin không? Nếu vậy bạn nên sử dụng -i
cờ.
Có thể những dòng đó không trống, vì vậy nếu đó là trường hợp, hãy xem câu hỏi này Xóa các dòng trống khỏi txtfiles, xóa khoảng trắng khỏi đầu và cuối dòng Tôi tin rằng đó là những gì bạn đang cố gắng đạt được.
sed -i '/^$/d'
là một cách để làm điều đó.
[]
nên không thể trốn thoát trong một biểu thức khung, vì vậy mã ở đây là không đúng cho \[\[:space:\]\]
hay \[ \t\]
- nên [[:space:]]
và [ \t]
.
Tôi tin rằng đây là cách dễ nhất và nhanh nhất:
cat file.txt | grep .
Nếu bạn cũng cần bỏ qua tất cả các dòng khoảng trắng thì hãy thử điều này:
cat file.txt | grep '\S'
Thí dụ:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
đầu ra
7
5
cat
, cũng grep
lấy các tập tin:grep . file.txt
grep '\S'
chắc chắn không phải là di động. Nếu bạn có grep -P
thì bạn có thể sử dụng grep -P '\S'
nhưng nó cũng không được hỗ trợ trên tất cả các nền tảng.
grep .
so với các giải pháp khác là nó sẽ làm nổi bật tất cả các văn bản màu đỏ. Các giải pháp khác có thể bảo tồn các màu gốc. So sánh unbuffer apt search foo | grep .
vớiunbuffer apt search foo | grep -v ^$
Với sự giúp đỡ từ câu trả lời được chấp nhận ở đây và câu trả lời được chấp nhận ở trên, tôi đã sử dụng:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Điều này bao gồm tất cả các cơ sở và hoạt động hoàn hảo cho nhu cầu của tôi. Kudos để áp phích ban đầu @Kent và @kev
Điều này làm việc trong awk là tốt.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Bạn rất có thể thấy hành vi không mong muốn vì tệp văn bản của bạn đã được tạo trên Windows, do đó, kết thúc chuỗi là \r\n
. Bạn có thể sử dụng dos2unix để chuyển đổi nó thành tệp văn bản kiểu UNIX trước khi chạy sed hoặc sử dụng
sed -r "/^\r?$/d"
để loại bỏ các dòng trống cho dù có trở lại vận chuyển hay không.
-r
cờ đang làm gì và có thể kết hợp nó với -i
để sửa đổi tệp trực tiếp và tránh in ra màn hình. Ngoài ra, tôi nghĩ rằng lệnh này cũng sẽ hoạt động nhưsed -r "/^\r$/d"
Một lựa chọn khác mà không sed
, awk
, perl
, vv
strings $file > $output
chuỗi - in chuỗi ký tự có thể in trong tệp.
strings
thay vì string
?
Câu bash
trả lời cụ thể của tôi là khuyên bạn nên sử dụng perl
toán tử thay thế với g
cờ mẫu chung cho việc này, như sau:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Câu trả lời này minh họa cho việc liệu các dòng trống có khoảng trắng trong chúng hay không [\ ]*
, cũng như sử dụng|
để phân tách nhiều thuật ngữ / trường tìm kiếm. Đã thử nghiệm trên macOS High Sierra và CentOS 6/7.
FYI, mã gốc của OP sed '/^$/d' $file
chỉ hoạt động tốt trong bash
Terminal trên macOS High Sierra và CentOS 6/7 Linux tại cụm siêu máy tính hiệu năng cao.
Đối với tôi với FreeBSD 10.1 với sed chỉ hoạt động giải pháp này:
sed -e '/^[ ]*$/d' "testfile"
phía trong []
có không gian và biểu tượng tab.
tập tin kiểm tra có chứa:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============