দীর্ঘ লাইনে প্রতি চারটি অক্ষর কীভাবে আমি একটি স্থান সন্নিবেশ করব?


30

আমি একটি দীর্ঘ রেখা পেয়েছি যে আমি প্রতি 4 অক্ষরে একটি স্পেস toোকাতে চাই, শক্ত পাঠের একক একক লাইনে এটি পড়া সহজ করে তোলে, এটি করার সহজ উপায়টি কী? এছাড়াও আমি পাইপ থেকে লাইন ইনপুট করতে সক্ষম হওয়া উচিত। যেমন

echo "foobarbazblargblurg" | <some command here>

দেয়

foob arba zbla rgbl urg

উত্তর:


54

নীচে হিসাবে সেড ব্যবহার করুন:

$ echo "foobarbazblargblurg" | sed 's/.\{4\}/& /g'
foob arba zbla rgbl urg

1
অভিশাপ যে খুব কাছাকাছি ছিল sedআমি প্রথমে চেষ্টা করেছি নিজেকে লাথি মারতে।
xenoterracide

7
শুধু কৌতূহল, '&' কী অর্জন করে? ওহ, এটি 'কেবল যা মেলে তার জন্য' স্ট্যান্ডিন। বোকা আমাকে।
সর্বময়ী

1
এটি লক্ষ করা উচিত যে এটি স্ট্রিংয়ের মধ্যে আরও একটি চরিত্র রয়েছে তবে এটি শেষে একটি স্থান যুক্ত করে, এটি পছন্দসই নয়
আনুবিস

@ আনুবিস's/.\{4\}/& /g;s/ $//'
wieczorek1990

21

আপনি নিম্নলিখিত সহজ উদাহরণ ব্যবহার করতে পারেন:

$ echo "foobarbazblargblurg" | fold -w4 | paste -sd' ' -
foob arba zbla rgbl

খুব সুন্দর ... আমি মনে করি এটি sedউত্তরের চেয়েও ভাল । আমি foldআগে সম্পর্কে জানতাম না ।
ওয়াইল্ডকার্ড

1
দুর্ভাগ্যক্রমে, জিএনইউর বর্তমান সংস্করণগুলির সাথে fold, এটি মাল্টি-বাইট অক্ষরগুলির সাথে কাজ করে না ( echo €€€€€€€€ | fold -w4 | paste -sd' ' -ইউটিএফ -8 এর মতো)।
স্টাফেন চেজেলাস

3

এখানে ব্যবহারের উদাহরণ grepএবং xargs:

$ echo "foobarbazblargblurg" | grep -o .... | xargs
foob arba zbla rgbl

xargsechoডিফল্টরূপে চালিত হয়, সুতরাং এটি প্রয়োগের -nenউপর নির্ভর করে ব্যাকস্ল্যাশ যুক্ত শব্দগুলির সাথে কাজ করবে না echo। এক্সার্গস যদি একের বেশি চালায় তবে আপনি একবারে বিজোড় নিউলাইন চরিত্রটি দেখতে পাবেন echopaste -sd ' ' -পরিবর্তে পাইপ করা ভাল । নোট করুন যে -oএকটি আদর্শ বিকল্প নয়।
স্টাফেন চেজেলাস

3

কেবল ব্যাশে, কোনও বাহ্যিক আদেশ নেই:

str="foobarbazblargblurg"
[[ $str =~ ${str//?/(.)} ]]
printf "%s%s%s%s " "${BASH_REMATCH[@]:1}"

বা এক-লাইন পাইপ সংস্করণ হিসাবে:

echo foobarbazblargblurg | 
  { IFS= read -r str; [[ $str =~ ${str//?/(.)} ]]; \
    printf "%s%s%s%s " "${BASH_REMATCH[@]:1}"; }

এটি যেভাবে কাজ করে তা হ'ল স্ট্রিংয়ের প্রতিটি অক্ষরকে "(।)" তে রূপান্তরিত করে রেগেক্স ম্যাচ এবং ক্যাপচারের জন্য =~, তারপরে BASH_REMATCH[]অ্যারে থেকে ক্যাপচার হওয়া এক্সপ্রেশনগুলি কেবল আউটপুট আউটপুট করে , প্রয়োজনীয় হিসাবে গোষ্ঠীভুক্ত করা। শীর্ষস্থানীয় / অনুসরণ / মধ্যবর্তী স্থান সংরক্ষণ করা হয়, "${BASH_REMATCH[@]:1}"এগুলি বাদ দিতে চারপাশে উদ্ধৃতিগুলি সরান ।

এখানে এটি একটি ফাংশনে আবৃত রয়েছে, কোনও আর্গুমেন্ট না থাকলে এটি তার আর্গুমেন্টগুলি প্রক্রিয়া করবে বা স্টিডিনটি পড়বে:

function fmt4() {
  while IFS= read -r str; do
    [[ $str =~ ${str//?/(.)} ]]
    printf "%s%s%s%s " "${BASH_REMATCH[@]:1}"
  done < <( (( $# )) && printf '%s\n' "$@" || printf '%s\n' $(< /dev/stdin) )
}

$ echo foobarbazblargblurg | fmt4
foob arba zbla rgbl urg 

সেই অনুসারে বিন্যাসের স্ট্রিং সামঞ্জস্য করতে আপনি সহজেই গণনাটিকে প্যারামিটারাইজ করতে পারেন।

একটি পিছনের স্থান যুক্ত করা হয়, printfযদি সমস্যা হয় তবে তার পরিবর্তে দুটি ব্যবহার করুন :

printf "%s%s%s%s" "${BASH_REMATCH[@]:1:4}"
(( ${#BASH_REMATCH[@]} > 5 )) && printf " %s%s%s%s" "${BASH_REMATCH[@]:5}"

প্রথম printfপ্রিন্টগুলি ( প্রথম অবধি) প্রথম 4 টি অক্ষর, দ্বিতীয় শর্তসাপেক্ষে গোষ্ঠীগুলিকে পৃথক করার জন্য একটি শীর্ষস্থানীয় স্থান দিয়ে সমস্ত বাকী (যদি থাকে) মুদ্রণ করে। জিরোথ উপাদানটির জন্য অ্যাকাউন্ট 4 হিসাবে নয় এমন 5 টি উপাদানের জন্য পরীক্ষা।

নোট:

  • printfএর %cপরিবর্তে শেল ব্যবহার করা যেতে পারে %s, %c(সম্ভবত) অভিপ্রায়টি আরও পরিষ্কার করা হয়েছে, তবে এটি মাল্টি-বাইট অক্ষর নিরাপদ নয়। আপনার বাশের সংস্করণটি যদি সক্ষম হয় তবে উপরের সমস্তটি মাল্টি-বাইট অক্ষর নিরাপদ।
  • শেলটি printfতার বিন্যাসের স্ট্রিংটি পুনরায় ব্যবহার করে যতক্ষণ না এটি তর্কগুলি শেষ না করে, তাই এটি কেবল একবারে 4 টি আর্গুমেন্ট গাব্বল করে এবং পিছনে যুক্তিগুলি পরিচালনা করে (সুতরাং অন্যান্য উত্তরগুলির মতো এখানে কোনও যুক্তির প্রয়োজন নেই যা তর্কিতভাবে ভুল)
  • BASH_REMATCH[0] সম্পূর্ণ মিলিত স্ট্রিং, সুতরাং সূচক 1 থেকে শুরু হওয়া কেবল আউটপুট
  • printf -v myvar ...পরিবর্তে একটি ভেরিয়েবল সংরক্ষণ করতে ব্যবহার করুন myvar(সাধারণ পঠন-লুপ / ​​সাব-শেল আচরণের সাপেক্ষে)
  • printf "\n"প্রয়োজনে যোগ করুন

আপনি zshযদি match[]পরিবর্তে অ্যারে ব্যবহার করেন তবে উপরের কাজটি করতে পারেন এবং পুরো ম্যাচের সাথে 0 টি উপাদান রাখে না বলে BASH_REMATCH[]সমস্ত সূচকে 1 টি বিয়োগ করতে পারেন zsh


3

সঙ্গে zshশুধুমাত্র:

str=foobarbazblargblurg

set -o extendedglob
printf '%s\n' ${str//(#m)????/$MATCH }

অথবা

printf '%s%s%s%s ' ${(s::)str}

সঙ্গে ksh93শুধুমাত্র:

printf '%s\n' "${str//????/\0 }"

যে কোনও পসিক্স শেল দিয়ে কেবল (ইনপুট দৈর্ঘ্য 4 এর একাধিক হলে পেছনের স্থানটি এড়ানোও):

out=
while true; do
  case $str in
    (?????*)
      new_str=${str#????}
      out=$out${str%"$new_str"}' '
      str=$new_str
      ;;
    (*)
      out=$out$str
      break
  esac
done
printf '%s\n' "$out"

এখন, এটি চরিত্রগুলির জন্য । আপনি গ্রাফিম ক্লাস্টার তে এটি করতে (উদাহরণস্বরূপ, বিরতি চেয়েছিলেন Stéphane, যেমন লিখিত $'Ste\u0301phane', যেমন Stép haneএবং Ste phan e), সঙ্গে zsh:

set -o rematchpcre
str=$'Ste\u301phane' out=
while [[ $str =~ '(\X{4})(.+)' ]] {
  out+="$match[1] " str=$match[2]
}
out+=$str
printf '%s\n' $out

Ksh93 এর সাহায্যে আপনি ডিসপ্লে প্রস্থটিও ভেঙে ফেলতে পারেন, যা উপরেরটির জন্য কাজ করবে Stéphane, তবে শূন্য-প্রস্থ বা ডাবল-প্রস্থের অক্ষরের সাথে যুক্ত হওয়াতেও সহায়তা করতে পারে :

str=$'Ste\u301phane' out=
while
  start=${ printf %L.4s. "$str"; }
  start=${start%.}
  [ "$start" != "$str" ]
do
  out+="$start " str=${str#"$start"}
done
out+=$str
printf '%s\n' "$out"

2

আমি প্রয়োজন হিসাবে কেবল স্থানগুলি সন্নিবেশ করে উত্তর দিতে যাচ্ছি যাতে একটি লাইনে কমপক্ষে প্রতি 4 টি অক্ষরের পরে একটি স্থান উপস্থিত হয়; নিশ্চিত নয় যে আপনি কোনভাবে এই কেসটি পরিচালনা করতে চান। উদাহরণস্বরূপ, "এ বি বি সি সি ডি ডি" এর ইনপুট দেওয়া হলে আপনি "আ বি বি সি সি ডি ডি" এর পরিবর্তে আউটপুট "এ বি বি সি সি ডি ডি" পাবেন।

আমি লুক হেডের জন্য পার্ল ব্যবহার করছি, তবে পার্লের সাথে আমি সাধারণভাবে খুব বেশি পরিচিত নই, সুতরাং সেখানে টুইটগুলি প্রয়োজন হতে পারে:

$ echo "foobarbazblargblurg" | perl -wp -e 's/[^ ]{4}(?=[^\n ])/$& /g'
foob arba zbla rgbl urg

$ echo 'aa bbccdd' | perl -wp -e 's/[^ ]{4}(?=[^\n ])/$& /g'
aa bbcc dd
# not 'aa b bccd d'!

$ echo 'some input' | perl -wp -e 's/[^ ]{4}(?=[^\n ])/$& /g'
some inpu t
# not 'some  inp ut'!

$ echo $'aabb\nc cddee' | perl -wp -e 's/[^ ]{4}(?=[^\n ])/$& /g' | 
> while read; do echo "${REPLY}x"; done
aabbx
c cdde ex
# no spaces added at the end of the first line (while loop to add to the end of
# the line and show this)

0

অজগর ব্যবহার করে এটি করেছি

প্রথমে আমি ফাইলটি পড়ছি তারপরে আমি 4 টি অক্ষর দ্বারা বিভক্ত হয়ে স্থান যুক্ত করছি

#!/usr/bin/python
import re
b=re.compile(r'[a-z]{4}')

p=open('/root/l.txt','r')
i=p.readlines()
for j in i:
    m=re.findall(b,j)
print " " .join (m) + "  "

/root/l.txt ==> আপনি উদাহরণস্বরূপ যে সামগ্রীটি দিয়েছেন তা অন্তর্ভুক্ত

আউটপুট

foob arba zbla rgbl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.