Có bất kỳ lệnh Linux tích hợp nào cho phép xuất ra một chuỗi gấp n lần một chuỗi đầu vào không ??
Có bất kỳ lệnh Linux tích hợp nào cho phép xuất ra một chuỗi gấp n lần một chuỗi đầu vào không ??
Câu trả lời:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
là nó sẽ liên tục áp dụng đối số dư thừa vào chuỗi định dạng "vòng lặp" for free. Theo "thừa", tôi có nghĩa là có nhiều đối số hơn %
giữ chỗ.
Đây là một cách cổ điển mà khá di động:
yes "HelloWorld" | head -n 10
Đây là phiên bản thông thường hơn của câu trả lời của Adrian Petrescu bằng cách sử dụng mở rộng nẹp:
for i in {1..5}
do
echo "HelloWorld"
done
Điều đó tương đương với:
for i in 1 2 3 4 5
Đây là một phiên bản ngắn gọn và năng động hơn của câu trả lời của pike :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
hoặc cách sed -n ':t;${s/\n//gp};N;bt'
khác là làm echo $(yes "HelloWorld" | head -n 10)
thêm khoảng trắng giữa mỗi bản sao của chuỗi. Tuy nhiên, một cách khác là đưa nó qua tr -d '\n'
đó cũng loại bỏ dòng mới cuối cùng.
yes
giải pháp chính xác là những gì tôi cần, vì tôi muốn lặp lại một lệnh (mà đầu ra dao động). Do đó:yes "$(my-command)" | head -n 2
Điều này có thể được tham số hóa và không yêu cầu biến tạm thời, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Hoặc, nếu $N
là kích thước của một mảng bash:
echo ${ARR[@]/*/blah}
printf
định dạng định dạng. Nếu dữ liệu chứa các chuỗi định dạng thì sao? Đây là cách chính xác để tự động chỉ định "độ chính xác" (độ dài): printf '%*s' "$N"
- tạo thói quen gửi chuỗi định dạng trong dấu ngoặc đơn để ngăn mở rộng biến ở đó.
Khá nhiều cách tốt đã được đề cập. Không thể quên về tuổi già seq
mặc dù:
[john @ awesome] $ cho tôi trong `seq 5`; làm tiếng vang "Hi"; xong Chào Chào Chào Chào Chào
{i..j}
thuật không bao giờ trả lại một phạm vi trống.)
Có lẽ một cách khác chung chung và hữu ích hơn cho bạn:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Shell bash mạnh hơn hầu hết mọi người nghĩ :)
yes
, printf
, for i in {1..5}
) mà nếu n
là số không, nó sẽ trả về chuỗi rỗng mà không tồn tại tình trạng của 1. Ngoài ra do các ký hiệu toán học để so sánh, nó rất dễ dàng để có bù đắp bằng 1 (ví dụ như bằng cách thay đổi <=
để <
)
Bạn có thể sử dụng một mẹo. Báo lại một biến trống không in bất cứ điều gì. Vì vậy, bạn có thể viết:
echo word$wojek{1..100}
Nếu $wojek1 $wojek2
... $wojek100
là các biến không tồn tại, bạn sẽ nhận được từ lặp lại 100 lần mà không có gì khác.
$_
thay vì $wojek
làm cho ý định rõ ràng hơn.
Lặp lại n
nhiều lần, chỉ cần đặt n-1
dấu phẩy giữa {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Lặp lại 'hellowworld' hai lần sau tiếng vang đầu tiên.
n
từ một biến thì sao?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Kết quả
Xin chao xin chao xin chao xin chao
dựa trên những gì @pike đã gợi ý
cho mỗi ký tự trong chuỗi echo chuỗi
echo ${target//?/$replace}
Một ví dụ về một tiêu đề được gạch chân với các =
ký tự
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
sẽ xuất
ABCDEF
======
Điều này dường như chuyển giữa linux và OS X và điều đó làm tôi hạnh phúc.
Xin chào!
Nếu bạn đang sử dụng BSD, bạn chỉ có thể sử dụng seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
, điều này mang lại seq: format 'Hello, world' has no % directive
, buộc một chỉ thị định dạng phải có mặt. GNU coreutils được sử dụng, ví dụ như nhiều bản phân phối Linux và Cygwin. Bao gồm thông tin ở đây cho những người thiếu thông tin mà nó chỉ hoạt động trong BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
đầu ra
ten ten ten ten ten ten ten ten ten ten
Giả sử bạn muốn một cái gì đó giống như x
toán tử của Perl , nơi bạn không tự động nhận được một dòng mới giữa các lần lặp lại:
x() {
# usage: x string num
for i in $(seq 1 $2); do printf "%s" "$1"; done
# print a newline only if the string does not end in a newline
[[ "$1" == "${1%$'\n'}" ]] && echo ""
}
x Hi 10 # ==> HiHiHiHiHiHiHiHiHiHi
x $'Hello World!\n' 3
Tôi rõ ràng đã sử dụng một for
vòng lặp bởi vì bạn không thể viết {1..$n}
bằng bash: mở rộng dấu ngoặc được thực hiện trước khi thay thế biến.
Không được tích hợp chính xác vào linux, nhưng nếu bạn đã cài đặt python ..
python
>>>var = "string"
>>>var*n
Hoặc trong một dòng, như bình luận đề xuất:
python -c 'print "This is a test.\n" * 10'
Hãy thử cái này:
echo $(for i in $(seq 1 100); do printf "-"; done)
Sẽ tạo (một trăm dấu gạch ngang):