2017-10-14 62 views
2

我看過這篇文章:sed delete remaining characters in line except first 5它幫助我刪除x後的所有字符。但是,我很難找到如何刪除x字符後的所有單詞。如何刪除X字符後的所有單詞

我開始使用此代碼:

echo "StackOverflow Users Are Brilliant And Hard Working" | sed 's/.//30g' 
#character 30 ---------------------^ 

我嘗試:

echo "StackOverflow Users Are Brilliant And Hard Working" | sed 's/ .* //30g' 
#character 30 ---------------------^ 

在這些輸出,我要麼切斷了最後一個字或詞計數。相反,我需要刪除30個字符後的單詞。我在不同的行/字長度上運行它,這就是爲什麼我不能把它放在單詞的末尾。

所需的輸出:

StackOverflow Users Are Brilliant 

如果你知道如何放在一起計算後x個字的話,您的幫助將不勝感激。

請注意:如前所述,不要將代碼更改爲33或34個字符。問題的關鍵在於在30個字符後刪除所有單詞。

回答

2

AWK會做

$ awk 'BEGIN{FS=OFS="" } length>30{i=30; while($i~/\w/) i++; NF=i-1; }1' file 
StackOverflow Users Are Brilliant 
This line has 22 chars 

設置FS=OFS=""使每一個字符被認爲是場

如果length>30然後i=30; while($i~/\w/) i++;即不斷遞增i,直到我們降落在一個非alnum字符;一旦循環結束設置所需的NF

length<=30一致的行將被打印。

使用的grep

$ grep -oE "^.{1,29}\w*" file 
StackOverflow Users Are Brilliant 
This line has 22 chars 

^.{1,29}\w*129因爲如果30th焦炭是非alnum那麼它不應該被考慮。

+1

酷解決方案@batman :-)適用於我! – DomainsFeatured

+0

grep解決方案是最短的一個,我試圖用grep解決這個問題,但忘記了'^'並且它產生了多行。 –

+0

@Paweł[email protected],我實際上在我的程序中使用了Pawel的解決方案。但是,我選擇這個是因爲'awk'和'grep'的雙重回答。此外,它的得分最高,我確實欠你一個蝙蝠俠。帕維爾,我希望很多人都喜歡你的答案,因爲你給出了非常有幫助的解釋。它對我幫助很大,也會幫助其他人。再次感謝batMan :-) – DomainsFeatured

2

怎麼樣簡單的和清醒的awk與它的神奇效用SUBSTR:

echo "StackOverflow Users Are Brilliant And Hard Working" | awk '{print substr($0,1,34)}' 

如果你想傳遞長度的awk然後以下可能會幫助你一樣。

echo "StackOverflow Users Are Brilliant And Hard Working" | awk -v end=34 '{print substr($0,1,end)}' 

如果你希望你的長度保存在一個shell變量,並希望通過它的awk然後以下可能會幫助你一樣。

val="34" 
echo "StackOverflow Users Are Brilliant And Hard Working" | awk -v var="$val" '{print substr($0,1,var)}' 

編輯:添加上相同的一個SED解決方案了。

echo "StackOverflow Users Are Brilliant And Hard Working" | sed 's/\(.\{34\}\)\(.*\)/\1/' 
+1

@DomainsFeatured,您的歡迎。看到我的編輯添加了3種方法(包括sed)來解決這個問題,讓我知道如果有任何疑問相同。 – RavinderSingh13

+1

哦,廢話,我只是意識到這是行不通的!我需要它在30個字符上工作,而不是34 :-(輸出是:'StackOverflow用戶是Brilli' – DomainsFeatured

+0

@DomainsFeatured,我已經給出了34個字符的解決方案,因爲我已經看到了您的預期輸出(直到輝煌的單詞) ,顯然你可以根據你的需要調整角色。 – RavinderSingh13

1

你可以用SED做到這一點:

echo "StackOverflow Users Are Brilliant And Hard Working" | sed 's/\(.\{1,30\}\w*\)\(.*\)/\1/' 

這應該適用於文本少於30個字符,以及 - 沒有修剪發生在這種情況下。

說明

這是我開始用正則表達式:

.{1,30}\w* 

它只是獲取1-30個字符,然後將所有的附加詞字符之後的。

我們能夠在sed我們不得不去掉一切使用它,我們需要兩組:

(.{1,30}\w*)(.*) 

現在,一些逃脫的「()」和「{}」:

\(.\{1,30\}\w*\)\(.*\) 

這可以去的sed:

sed 's/<pattern>/<replacement>/<flags>' 

我們要刪除第二組,這樣在sed我們使用 '\ 1'(第一組)更換:

echo "..." | sed 's/\(.\{1,30\}\w*\)\(.*\)/\1/' 
+0

嘿帕維爾,是的!這是我正在尋找的。如果您可以提供'\(。\ {1,30 \} \ w \ + \)\(。* \)/ \ 1'部分的解釋,我很樂意學習。否則,感謝您的幫助。我會在今天晚些時候標記最好的答案:-) – DomainsFeatured

+0

有一個小錯誤,我編輯了答案。我會在幾分鐘內寫出解釋。 –

+1

說明已添加 –

1

這可能爲你工作(GNU SED):

sed -r 's/^(.{30}\S*).*/\1/' file 

這保留了前30個字符和任何以下非空格字符。

N.B.如果30字符是一個空格,下面的字將被包括在內,所以正則表達式可能是:

sed -r 's/^(.{29}\S*).*/\1/' file 
+0

嘿@potong,非常感謝你的回答和解釋。這使得很多道理:-) – DomainsFeatured

1

使用bash

var="StackOverflow Users Are Brilliant And Hard Working" 
echo ${var:0:30} 

或者

expr substr "$var" 1 30 
+0

不適合我...我得到的輸出:'StackOverflow用戶是Brilli' – DomainsFeatured

+0

對不起,我明白你想停止30個字符後 –

+0

是的,但我需要包括其餘的單詞'StackOverflow用戶是輝煌的'。您的輸出將'Brilliant'剪切成'Brilli' – DomainsFeatured

0

隨着GNU AWK的gensub():

$ awk '{$0=gensub(/(.{30}\S*).*/,"\\1",1)} 1' file 
StackOverflow Users Are Brilliant 

或GNU sed的:

$ sed -E 's/(.{30}\S*).*/\1/' file 
StackOverflow Users Are Brilliant 
相關問題