Đây là tệp ví dụ:
somestuff...
all: thing otherthing
some other stuff
Những gì tôi muốn làm là thêm vào dòng bắt đầu bằng all:
như thế này:
somestuff...
all: thing otherthing anotherthing
some other stuff
Câu trả lời:
Điều này phù hợp với tôi
sed '/^all:/ s/$/ anotherthing/' file
Phần đầu tiên là một mẫu để tìm và phần thứ hai là một sự thay thế của sed thông thường sử dụng $
cho cuối dòng.
Nếu bạn muốn thay đổi tệp trong quá trình này, hãy sử dụng -i
tùy chọn
sed -i '/^all:/ s/$/ anotherthing/' file
Hoặc bạn có thể chuyển hướng nó đến một tệp khác
sed '/^all:/ s/$/ anotherthing/' file > output
Bạn có thể nối văn bản $0
vào awk nếu nó phù hợp với điều kiện:
awk '/^all:/ {$0=$0" anotherthing"} 1' file
/patt/ {...}
nếu dòng khớp với mẫu được cung cấp bởi patt
, hãy thực hiện các hành động được mô tả bên trong {}
./^all:/ {$0=$0" anotherthing"}
nếu dòng bắt đầu (được biểu thị bằng ^
) bằng all:
, thì nối thêm anotherthing
vào dòng.1
như một điều kiện đúng, kích hoạt hành động mặc định awk
: in dòng hiện tại ( print $0
). Điều này sẽ luôn xảy ra, vì vậy nó sẽ in dòng gốc hoặc dòng đã sửa đổi.Đối với đầu vào đã cho của bạn, nó trả về:
somestuff...
all: thing otherthing anotherthing
some other stuff
Lưu ý rằng bạn cũng có thể cung cấp văn bản để thêm vào một biến:
$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff
awk: can't set $0
/usr/xpg4/bin/awk
awk "tốt".
Trong bash:
while read -r line ; do
[[ $line == all:* ]] && line+=" anotherthing"
echo "$line"
done < filename
Đây là một giải pháp đơn giản khác bằng cách sử dụng sed.
$ sed -i 's/all.*/& anotherthing/g' filename.txt
Giải trình:
tất cả. * có nghĩa là tất cả các dòng bắt đầu bằng 'tất cả'.
& đại diện cho trận đấu (nghĩa là dòng hoàn chỉnh bắt đầu bằng 'tất cả')
sau đó sed thay thế cái trước bằng cái sau và thêm vào từ 'anotherthing'
Giải pháp với awk:
awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file
Đơn giản: nếu hàng bắt đầu bằng all
in hàng cộng với "cái khác", thì chỉ in hàng đó.
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
condition {actions}
cặp. Nếu condition
bỏ qua, các hành động được thực hiện cho mọi bản ghi. Nếu giá trị {actions}
bị bỏ qua và điều kiện đánh giá là true (trường hợp của số 1
) thì hành động mặc định là in bản ghi hiện tại.