Trong một tệp có nhiều dòng tôi muốn xóa các dòng bắt đầu bằng HERE IT IS
.
Làm thế nào tôi có thể làm điều này bằng cách chỉ sử dụng các công cụ dòng lệnh?
Trong một tệp có nhiều dòng tôi muốn xóa các dòng bắt đầu bằng HERE IT IS
.
Làm thế nào tôi có thể làm điều này bằng cách chỉ sử dụng các công cụ dòng lệnh?
Câu trả lời:
Hãy thử sed
:
sed -i '/^HERE IT IS/d' <file>
CẢNH BÁO: Tốt hơn là nên sao lưu khi sử dụng -i
công tắc sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Các tập tin ban đầu sẽ vẫn như <file>.bak
và tập tin sửa đổi sẽ được <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.
Ngoài những câu trả lời hay grep
và sed
bạn đã nhận được, đây là một số công cụ khác có thể làm điều tương tự:
Một vài cách Perl:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
Bạn có thể thêm công -i
tắc vào bất kỳ ví dụ nào để chỉnh sửa tệp tại chỗ:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(g)
awk '!/^HERE IT IS/' file > newfile
Các phiên bản mới hơn (4.1.1 trở lên) của GNU awk
(mặc định awk
trên Linux) cũng có thể chỉnh sửa tệp tại chỗ:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash
, zsh
, ksh
, có lẽ những người khác). Điều này là loại ngớ ngẩn, nó có thể được thực hiện nhưng các công cụ khác là tốt hơn.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
đã biến tôi thành LOL)
printf "%s\n" "$line"
: trích dẫn dòng $ để duy trì khoảng trắng và tránh một số vấn đề về tiếng vang (diễn giải các ký tự đặc biệt, v.v.). và tránh sự cần thiết phải thêm --
quá.
IFS=
và -r
, tôi cũng có thể đi tất cả các cách và làm cho nó mạnh mẽ.
sed
chắc chắn là con đường để đi
Điều chỉnh nhỏ này của lệnh @heemayl đã cho bạn sẽ xóa dòng cho dù trường hợp tương tự có được sử dụng trong mẫu hay không, do tham chiếu I trong mẫu.
sed -i '/HERE IT IS/Id' <file>
Nếu bạn có một vài tệp trong một thư mục mà bạn muốn thực hiện điều này, bạn có thể kết hợp nó với tìm như vậy.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Tùy chọn maxdepth có nghĩa là điều này sẽ không tái diễn vào các thư mục.
Một tùy chọn trăn khác:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Trong đó f là đường dẫn đến tệp, giữa các dấu ngoặc kép.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
khẳng định cái nhìn tiêu cực làm cho công cụ regex khớp với tất cả các ranh giới bắt đầu dòng ( thường được khớp bởi^
) chỉ khi nó không được theo sau bởi chuỗiHERE IT IS
trăn
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Lưu tập lệnh trong một tập tin, nói script.py
và sau đó chạy nó thông qua lệnh dưới đây trên thiết bị đầu cuối.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, nhưng nó không hiệu quả hơn nhiều startswith
. Tôi tự hỏi làm thế nào [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
sẽ không tạo ra đầu ra trong một danh sách.
Bạn có thể sử dụng Vim trong chế độ Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
tìm kiếm toàn cầu
d
xóa bỏ
x
lưu và đóng
vim
như vậy :vim '+g/^HERE IT IS/d' +wq test.txt
;)